[英]Sed string reverse
我正在尝试编写sed命令来反转字符串。 例如:如果我输入“ america”作为输入,则输出应为“ acirema”。
请帮忙。
仅供参考:我可以使用Shell脚本(Python脚本)来执行此操作。 但是我无法使用SED做到这一点。
GNU 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
基本上,这个想法是用换行标记字符串的开始和结束,然后,当换行在字符串中移动时,交换相邻的字符。
除了GNU sed手册中的版本以外,如果您不介意分两个阶段进行操作,则可以在非GNU sed中进行。
$ echo Canada | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
adanaC
这使用格式替换在脚本中包括换行符。 它的工作方式是先将输入字符串每个字符分成一行,然后将字符插入保持缓冲区的开头。
什么? 插入字符?
当然... x
交换保留空间和模式空间,abd H
将(当前)模式空间附加到保留空间。 因此,对于每个字符,我们将其放置到容纳空间中,然后将旧的容纳空间附加到其上,从而反转输入。
最后的命令删除换行符以重建原始字符串。
这适用于任何单个字符串,但是它将多行输入连接为单个输出字符串。
这可能对您有用(GNU sed):
sed -r 'G;:a;s/^(.)(.*\n)/\2\1/;ta;s/\n//' file
使用默认的保留缓冲区附加换行符。 在换行符后附加/插入第一个非换行符。 重复直到失败,然后删除(开头)换行符。
不需要GNUsed的另一个解决方案:
sed -e 's/^/\
/' -e ':a' -e 's/\n\(.*\)\(.\)/\2\
\1/
ta' -e 's/\n//'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.