【问题标题】:Sed string reversesed字符串反转
【发布时间】:2018-01-15 06:18:33
【问题描述】:

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

请帮忙。

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

【问题讨论】:

标签: linux sed


【解决方案1】:

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

基本上这个想法是用换行符标记字符串的开始和结束,然后,当换行符在字符串中移动时,交换相邻的字符。

【讨论】:

  • 啊,你也发现了。删除我的答案。
【解决方案2】:

除了 GNU sed 手册中的版本之外,如果您不介意分两个阶段执行此操作,您可以在非 GNU sed 中执行此操作。

$ echo Canada | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
adanaC

这使用格式替换在脚本中包含换行符。它首先将输入字符串分成每个字符一行,然后将字符插入到保持缓冲区的开头。

什么?插入字符?

当然...x 交换保持空间和模式空间,abd H 将(当前)模式空间附加到保持空间。因此,对于每个字符,我们将该字符放入保存空间,然后将旧的保存空间附加到它,从而反转输入。

最后一个命令删除换行符以重建原始字符串。

这应该适用于任何单个字符串,但它会将多行输入连接成单个输出字符串。

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -r 'G;:a;s/^(.)(.*\n)/\2\1/;ta;s/\n//' file
    

    使用默认保持缓冲区添加换行符。在换行符之后追加/插入第一个非换行符。重复直到失败,然后删除(前导)换行符。

    【讨论】:

    • 不错,没有管道的短单衬里。如果你转义大括号,它甚至不需要 -r 选项:sed 'G;:a;s/^\(.\)\(.*\n\)/\2\1/;ta;s/\n// 并且也适用于 BusyBox sed。
    【解决方案4】:

    另一个不需要 GNUsed 的解决方案:

    sed -e 's/^/\
    /' -e ':a' -e 's/\n\(.*\)\(.\)/\2\
    \1/
    ta' -e 's/\n//'
    

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多