【问题标题】:A quick way to revert words in sentence in unix?在unix中恢复句子中单词的快速方法?
【发布时间】:2012-03-12 01:22:11
【问题描述】:

我需要以相反顺序还原句子中单词的东西。我相信不用写脚本也是可以的。

接收像echo AAaa BBbb CCcc | foo这样的输入流并打印CCcc BBbb AAaa的东西

对不起,我改变了例子,单词本身不应该被还原。所以,rev 不起作用

【问题讨论】:

    标签: linux string shell unix awk


    【解决方案1】:

    好吧,当我看到这个问题时,我也想到了 tac 或 rev。但是我猜 OP 用 AAA BBB 做了一个坏例子。他可能想要还原“单词”,但不是所有字符。

    看看这个,如果你想要的话:

    kent$  echo "this is another test example"|awk '{for(i=NF;i>0;i--)printf $i" "}'
    example test another is this      
    

    【讨论】:

    • 此解决方案适用于多行输入,但在末尾留出额外空间。可以通过echo "a b c" | awk '{for(i=NF;i>0;i--)printf $i" "}' | sed -e 's/^/|/;s/$/|/'查看。
    • 重新避免不必要的尾随空格:echo "a b c" | awk '{for(i=NF;i>1;i--)printf $i" "}{print $1}' ...(如果您不想要尾随 ORS,请使用 printf $1
    【解决方案2】:

    当然有,它的rev

    ~ $ echo AAA BBB CCC DDD | rev
    DDD CCC BBB AAA
    ~ $ 
    

    编辑:

    好的,你也可以试试这样使用tac

    ~ $ echo -n "AAaa BBbb CCcc DDdd " | tac -s ' '
    DDdd CCcc BBbb AAaa ~ $
    

    唯一的问题是它不会在字符串末尾显示新行。

    【讨论】:

      【解决方案3】:
      echo AAaa BBbb CCcc | tr ' ' '\n' | tac | tr '\n' ' '
      

      【讨论】:

        【解决方案4】:
        tac AAAA BBBB CCCC
        

        试试那个!

        【讨论】:

        • 我认为你的意思是echo "AAAA BBBB CCCC" | tac 不过,对我来说,它还原的是线条而不是文字。
        • @zeroos 现在我在一个非常旧版本的 mac osx 上,所以我无法直接验证它:)(旧 mac os 没有 cat 命令)
        【解决方案5】:

        使用 sed 的神秘版本,处理多行输入,以及单词之间和行首/行尾的空格:

        echo -e "  AAaa     BBbb CCcc\nZ Y X" | sed -e 'G;:a;s/^\([^ ]*\) \(.*\)\n\(.*\)$/\2\n \1\3/;ta;s/\n//'
        

        它的作用是:

        1. 在行尾添加新行(G 命令),
        2. 将第一个单词放在换行符之后(大的s 命令),
        3. 只要有单词就循环到上一个,
        4. 删除最后一个单词(现在是第一个单词)和句子其余部分之间的新行。

        【讨论】:

          【解决方案6】:

          在纯 bash 中,因此不需要子进程,并且像 awk 解决方案一样处理多行输入,但如果在行的开头/结尾处的单词之间有很多空格,则无法工作:-(:

          function revert_line_in() {
            test $# -eq 0 && return
            test $# -eq 1 && echo -n "$1"
            test $# -eq 1 || { local word=$1; shift; revert_line_in $@; echo -n " $word"; }
          }
          
          function revert_line() {
            while read line; do revert_line_in $line; echo; done
          }
          
          echo -e "    AAaa   BBbb CCcc\nthis is another test example" | revert_line
          
          revert_line <<< "AAaa BBbb CCcc
          this is another test example"
          
          revert_line < file
          

          注意声明局部变量的函数中的local 关键字。如果省略,解决方案将中断。

          【讨论】:

            猜你喜欢
            • 2019-11-26
            • 1970-01-01
            • 1970-01-01
            • 2022-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多