用SED反向输入顺序



我有一个文件,我们称其为'a.txt',此文件包含以下文本行

do to what

我想知道sed命令是什么扭转本文的顺序,使其看起来像

what to do

我必须做某种附加吗?就像附加的" do" to'to',所以看起来像

to do(使用的 只是为了清晰)

我知道 tac可以做一些相关的事情

$ cat file
 do to what
$ tac -s' ' file
what to do  $

-s定义了分隔符,默认情况下是一个newline。

我将使用 awk做到这一点:

awk '{ for (i=NF; i>=1; i--) printf (i!=1) ? $i OFS : $i "n" }' file.txt

结果:

what to do

edit

如果您需要单线来修改"就地"文件,请尝试:

{ rm file.txt && awk '{ for (i=NF; i>=1; i--) printf (i!=1) ? $i OFS : $i "n" }' > file.txt; } < file.txt

sed答案

当这个问题被标记为sed时,我的第一个答案是:

首先(使用仲裁_来标记查看的空间,当a.txt包含do to what

sed -e '
    :a;
    s/([^_]*) ([^ ]*)/2_1/;
    ta;
    y/_/ /;
   ' a.txt
what to do

a.txt包含do to to what

sed -e '
    :a;
    s/^(|.* )([^+ ]+) 2([+]*)(| .*)$/123+4/g;
    ta;
    :b;
    s/([^_]*) ([^ ]*)/2_1/;
    tb;
    y/_/ /;
   ' <<<'do to to to what'
what to++ do

每个 supressed 重复的单词有一个+

sed -e ':a;s/^(|.* )([^+ ]+) 2([+]*)(| .*)$/123+4/g;ta;
        :b;s/([^_]*) ([^ ]*)/2_1/;tb;
        y/_/ /;' <<<'do do to what what what what'
what+++ to do+

bash答案

但是,由于有很多人在寻找简单的bash解决方案,因此有一种简单的方法:

xargs < <(uniq <(tac <(tr   \n <<<'do do to what what what what')))
what to do

这可以写:

tr   \n <<<'do do to what what what what' | tac | uniq | xargs 
what to do

,甚至有一些bash脚本:

revcnt () { 
    local wrd cnt plut out="";
    while read cnt wrd; do
        printf -v plus %$((cnt-1))s;
        out+=$wrd${plus// /+} ;
    done < <(uniq -c <(tac <(tr   \n )));
    echo $out
}

会做:

revcnt <<<'do do to what what what what' 
what+++ to do+

或as 纯bash

revcnt() { 
    local out i;
    for ((i=$#; i>0; i--))
    do
        [[ $out =~ ${!i}[+]*$ ]] && out+=+ || out+= ${!i};
    done;
    echo $out
}

必须将提交的字符串作为参数提交:

revcnt do do to what what what what
what+++ to do+

或需要prossessing 标准输入(或来自文件):

revcnt() { 
    local out i arr;
    while read -a arr; do
        out=""
        for ((i=${#arr[@]}; i--; 1))
        do
            [[ $out =~ ${arr[i]}[+]*$ ]] && out+=+ || out+= ${arr[i]};
        done;
        echo $out;
    done
}

因此您可以处理多行:

revcnt <<eof
do to what
do to to to what
do do to what what what what
eof
what to do
what to++ do
what+++ to do+

这可能对您有用(gnu sed):

sed -r 'G;:a;s/^n//;t;s/^(S+|s+)(.*)n/2n1/;ta' file

说明:

  • G在模式空间的末端添加新线(PS)
  • :a循环名称空间
  • s/^n//;t当新线在PS的前面时,将其删除并打印行
  • s/^(S+|s+)(.*)n/2n1/;ta直接在新线之后插入非空间或空格字符串,然后循环到 :a

-r开关使得regexp更容易在左右(分组(...),交替...|...和用于一户或实际的+的Metacharacter,可以放弃对Backslash前缀的需要)。

)。 )。 )

替代:

sed -E 'G;:a;s/^(S+)(s*)(.*n)/321/;ta;s/.//' file

n.b。要逆转线路,请将上述解决方案调整为:

sed -E 'G;:a;/^(.)(.*n)/21/;ta;s/.//' file

可能是您想要的:

perl -F -lane '@rev=reverse(@F);print "@rev"' your_file

正如伯恩哈德所说,tac可以在这里使用:

#!/usr/bin/env bash
set -eu
echo '1 2 3
2 3 4
3 4 5' | while IFS= read -r; do
    echo -n "$REPLY " | tac -s' '
    echo
done
$ ./1.sh
3 2 1 
4 3 2 
5 4 3 

我相信我的示例更有帮助。

sed

当您知道要交换的确切单词时:

$ cat a.txt
do to what
$ sed -ri '/do.*what/ s/do/what/' a.txt
$ cat a.txt
what to what
$ sed -ri '/what.*what/ s/what$/do/' a.txt
$ cat a.txt
what to do

但是,您必须确切知道单词的位置,它们的情况,周围的单词,无论它们是在句子/行的开始还是结束时等。要使用的正确的Metacharacters将取决于此信息。

相关内容

  • 没有找到相关文章

最新更新