在shell中用一个字符替换另一个字符(反之亦然)

nvbavucw  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(184)

假设我有这样的字符串:

$ 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是有用的(我喜欢在底部看到更新的提交)。

xv8emn3q

xv8emn3q1#

tr是您的朋友:

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

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

aor9mmx1

aor9mmx12#

我认为这可以通过(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/\b\/c
$
  • -F "/"这定义了分隔符,输入将被拆分为“/",并且不应再包含“/”字符。
  • for(i=1;i<=NF;i++) gsub(/\\/,"/",$i);。这将在输入的所有项中将反斜杠(\)替换为斜杠(/)。
wlzqhblo

wlzqhblo3#

如果要将/的每个示例替换为\,可以使用sed的y命令,该命令与tr的功能非常相似:

$ a='/o\'
$ echo "$a"
/o\
$ echo "$a" | sed 'y|/\\|\\/|'
\o/
$ b='\//\\/'
$ echo "$b"
\//\\/
$ echo "$b" | sed 'y|/\\|\\/|'
/\\//\
dtcbnfnu

dtcbnfnu4#

如果您严格限制使用GNU AWK,您可能会通过以下方式获得所需结果,让file.txt内容为

\//\\\\/

然后

awk 'BEGIN{FPAT=".";OFS="";arr["/"]="\\";arr["\\"]="/"}{for(i=1;i<=NF;i+=1){if($i in arr){$i=arr[$i]}};print}' file.txt

给出输出

/\\////\

说明:我使用FPAT内置变量和输出字段分隔符通知GNU AWK,字段可以是任何单个字符,(OFS)是空字符串,并创建数组,其中键值对表示要替换字符,\需要转义,因此\\表示文字\。然后,对于每一行,我使用for循环迭代所有字段,如果给定字段包含arr键数组中字符,我会在print行循环后将其交换为相应值

  • (在gawk 4.2.1中测试)*

相关问题