Sed字符串反向

时间:2018-01-14 02:39:09

标签: linux sed

我正在尝试编写sed命令来反转字符串。 例如:如果我进入"美国"因为输入输出应该是" acirema"。

请帮忙。

供参考: 我可以使用shell脚本,Python脚本来做到这一点。但我无法使用SED来做到这一点。

4 个答案:

答案 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//'