【问题标题】:Replace one character by the other (and vice-versa) in shell在 shell 中用另一个字符替换一个字符(反之亦然)
【发布时间】:2022-11-04 00:54:50
【问题描述】:

假设我有如下字符串:

$ a='/o\\'
$ echo $a
/o\
$ b='\//\\\\/'
$ echo $b
\//\\/

我想要一个 shell 脚本(最好是单行脚本)来用 \ 替换出现的 /,反之亦然。

假设命令名为invert,它将产生(在 shell 提示符下):

$ invert $a
\o/
$ invert $b
/\\//\

例如使用sed,似乎无法避免使用临时字符,这不是很好,像这样:

$ echo $a | sed 's#/#%#g' | sed 's#\\#/#g' | sed 's#%#\\#g'
\o/
$ echo $b | sed 's#/#%#g' | sed 's#\\#/#g' | sed 's#%#\\#g'
/\\//\

在某些情况下,这对于正确打印git log --graph --all | tac 很有用(我喜欢在底部看到较新的提交)。

【问题讨论】:

    标签: shell awk sed


    【解决方案1】:

    我认为这可以通过 (g)awk 来完成:

    $ echo a/\b\/c | gawk -F "/" 'BEGIN{ OFS="\" } { for(i=1;i<=NF;i++) gsub(/\/,"/",$i); print $0; }'
    a/b/c
    $ echo a\/b/\c | gawk -F "/" 'BEGIN{ OFS="\" } { for(i=1;i<=NF;i++) gsub(/\/,"/",$i); print $0; }'
    a//c
    $
    
    • -F "/" 这定义了分隔符,输入将被拆分为“/”,并且不应再包含“/”字符。
    • for(i=1;i&lt;=NF;i++) gsub(/\/,"/",$i);。这将在输入的所有项目中将反斜杠 () 替换为斜杠 (/)。

    【讨论】:

      【解决方案2】:

      tr 是你的朋友:

      % echo 'abc' | tr ab ba      
      bac
      % echo '/o' | tr '\/' '/\'
      o/
      

      (转义输出中的反斜杠可能需要单独的步骤)

      【讨论】:

        猜你喜欢
        • 2018-03-20
        • 2019-12-27
        • 2020-02-08
        • 2011-08-21
        • 2021-06-15
        • 2021-04-05
        • 2013-12-03
        • 2012-01-01
        • 1970-01-01
        相关资源
        最近更新 更多