【发布时间】:2012-03-12 01:22:11
【问题描述】:
我需要以相反顺序还原句子中单词的东西。我相信不用写脚本也是可以的。
接收像echo AAaa BBbb CCcc | foo这样的输入流并打印CCcc BBbb AAaa的东西
对不起,我改变了例子,单词本身不应该被还原。所以,rev 不起作用
【问题讨论】:
标签: linux string shell unix awk
我需要以相反顺序还原句子中单词的东西。我相信不用写脚本也是可以的。
接收像echo AAaa BBbb CCcc | foo这样的输入流并打印CCcc BBbb AAaa的东西
对不起,我改变了例子,单词本身不应该被还原。所以,rev 不起作用
【问题讨论】:
标签: linux string shell unix awk
好吧,当我看到这个问题时,我也想到了 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
当然有,它的rev:
~ $ echo AAA BBB CCC DDD | rev
DDD CCC BBB AAA
~ $
编辑:
好的,你也可以试试这样使用tac:
~ $ echo -n "AAaa BBbb CCcc DDdd " | tac -s ' '
DDdd CCcc BBbb AAaa ~ $
唯一的问题是它不会在字符串末尾显示新行。
【讨论】:
echo AAaa BBbb CCcc | tr ' ' '\n' | tac | tr '\n' ' '
【讨论】:
tac AAAA BBBB CCCC
试试那个!
【讨论】:
echo "AAAA BBBB CCCC" | tac 不过,对我来说,它还原的是线条而不是文字。
使用 sed 的神秘版本,处理多行输入,以及单词之间和行首/行尾的空格:
echo -e " AAaa BBbb CCcc\nZ Y X" | sed -e 'G;:a;s/^\([^ ]*\) \(.*\)\n\(.*\)$/\2\n \1\3/;ta;s/\n//'
它的作用是:
G 命令),s 命令),【讨论】:
在纯 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 关键字。如果省略,解决方案将中断。
【讨论】: