如何用sed替换捕获组中的字符

如何用sed替换捕获组中的字符

给定以下形式的模式:

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命令会分支到标签。 (条件“转到”。):as

答案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代码。

相关内容