我正在尝试编写sed命令来反转字符串。 例如:如果我进入"美国"因为输入输出应该是" acirema"。
请帮忙。
供参考: 我可以使用shell脚本,Python脚本来做到这一点。但我无法使用SED来做到这一点。
答案 0 :(得分:6)
GNU sed manual中有一个例子:
<强> rev.sed 强>
/../! b
# Reverse a line. Begin embedding the line between two newlines
s/^.*$/\
&\
/
# Move first character at the end. The regexp matches until
# there are zero or one characters between the markers
tx
:x
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/
tx
# Remove the newline markers
s/\n//g
像这样运行:
echo america | sed -f rev.sed
输出:
acirema
基本上这个想法是用新行标记字符串的开头和结尾,然后,当新行在字符串中移动时,交换相邻的字符。
答案 1 :(得分:2)
除了GNU sed手册中的版本之外,如果您不介意分两个阶段进行,可以在非GNU sed中执行此操作。
$ echo Canada | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
adanaC
这使用格式替换在脚本中包含换行符。它的工作原理是首先将输入字符串分成每个字符一行,然后将字符插入保持缓冲区的开头。
什么?插入字符?
当然...... x
交换保留空间和模式空间,abd H
将(当前)模式空间附加到保留空间。因此,对于每个角色,我们将该角色放入保留空间,然后将旧的保持空间附加到它,从而反转输入。
最后一个命令删除换行符以重建原始字符串。
这适用于任何单个字符串,但它会将多行输入连接成一个输出字符串。
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -r 'G;:a;s/^(.)(.*\n)/\2\1/;ta;s/\n//' file
使用默认保持缓冲区附加换行符。在换行符后面追加/插入第一个非换行符。重复直到失败,然后删除(前导)换行符。
答案 3 :(得分:0)
另一种不需要GNUsed的解决方案:
sed -e 's/^/\
/' -e ':a' -e 's/\n\(.*\)\(.\)/\2\
\1/
ta' -e 's/\n//'