假设我有这样的字符串:
$ 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
是有用的(我喜欢在底部看到更新的提交)。
4条答案
按热度按时间xv8emn3q1#
tr
是您的朋友:(转义输出中的反斜杠可能需要单独的步骤)
aor9mmx12#
我认为这可以通过(g)awk来实现:
-F "/"
这定义了分隔符,输入将被拆分为“/",并且不应再包含“/”字符。for(i=1;i<=NF;i++) gsub(/\\/,"/",$i);
。这将在输入的所有项中将反斜杠(\
)替换为斜杠(/
)。wlzqhblo3#
如果要将
/
的每个示例替换为\
,可以使用sed的y
命令,该命令与tr
的功能非常相似:dtcbnfnu4#
如果您严格限制使用GNU
AWK
,您可能会通过以下方式获得所需结果,让file.txt
内容为然后
给出输出
说明:我使用
FPAT
内置变量和输出字段分隔符通知GNUAWK
,字段可以是任何单个字符,(OFS
)是空字符串,并创建数组,其中键值对表示要替换字符,\
需要转义,因此\\
表示文字\
。然后,对于每一行,我使用for
循环迭代所有字段,如果给定字段包含arr
键数组中字符,我会在print
行循环后将其交换为相应值