给定以下形式的模式:
a\b\c\d:text\text
如何使用 sed 输出
a/b/c/d:text\text
也就是说,给定一个使用反斜杠后跟冒号后跟任意文本的路径,如何仅用正斜杠替换冒号前面的反斜杠?
答案1
有几种方法可以做到这一点;这是一个:
sed -e ':a' -e 's_^\([^:]*\)\\_\1/_;t a'
面包屑说明:
-e
指定编辑命令。这里有两个这样的命令。
:a
定义可在“goto”语句中使用的标签。
该s
命令会将行上的第一个反斜杠替换为正斜杠,只要第一个反斜杠出现在任何冒号字符之前即可。
如果使用该命令成功进行了替换,则该t a
命令会分支到标签。 (条件“转到”。):a
s
答案2
使用awk
而不是sed
:
awk -v FS=':' -v OFS=':' '{ gsub(/\\/,"/",$1) } { print }'
这将数据视为以:
- 分隔的记录,并使用gsub()
第一个字段中的正斜杠替换所有反斜杠。然后输出修改后的数据。
我设置了输入字段分隔符 ( FS
) 和输出字段分隔符 ( OFS
),:
以便输入在冒号上分割,以便稍后在输出发生时再次插入冒号。
如果 shell 变量中有文本,则可以直接在 shell 中执行此操作,而无需使用任何外部实用程序:
a='a\b\c\d:text\text'
b=${a%%:*} # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:} # the end of the string ("remove the first : and everything before it from $a")
a="${b//\\//}:$c"
printf '%s\n' "$a"
a/b/c/d:text\text
此代码片段将在任何sh
支持参数扩展${parameter//pattern/string}
(POSIX 标准的扩展)的shell 中打印字符串。
这或多或少是在模仿awk
代码。