![如何使用 sed 替换多个字符?](https://linux22.com/image/165589/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E5%A4%9A%E4%B8%AA%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我有这个脚本:
replace 3
echo 12345 | sed "s/^\(.\){"$1"}/\1hi/"
我也尝试过这个:
echo 12345 | sed "s/^\(.{"$1"}\)/\1hi/"
在这种情况下,我希望脚本在“12345”(123hi45) 的前 3 个字符后添加“hi”。这是一个脚本,因此“3”是一个参数并且可以更改。我真的被困在这里了。提前致谢!
答案1
如果您转义了大括号,您的命令就会起作用(我还引用了$1
您因未知原因而未加引号的内容):
$ set -- 3
$ echo 12345 | sed "s/^\(.\{$1\}\)/\1hi/"
123hi45
重复修饰符{n}
是扩展正则表达式修饰符,其中基本的正则表达式写为\{n\}
.该sed
实用程序默认使用基本正则表达式。
您可以通过将其重写为来节省一些字符
echo 12345 | sed "s/^.\{$1\}/&hi/"
就我个人而言,我会采取另一种方法......
hi
您想要在第三个字符之后添加字符串12345
,其中“第三个”由 中的值给出$1
。
echo 12345 | sed 's/./&hi/'"$1"
当$1
是时3
,sed
表达式将如下所示
s/./&hi/3
这会将(任何字符)的第三个匹配替换.
为相同的字符(这就是&
替换中的内容),后跟hi
.
像这样在命令n
末尾放置一个数字, 可以替换模式的第 :th 匹配项。s
sed
sed
n
测试运行(出于可读性原因,修改了输入并进行了替换):
$ set -- 3
$ echo abcde | sed 's/./&<hi>/'"$1"
abc<hi>de
$ set -- 4
$ echo abcde | sed 's/./&<hi>/'"$1"
abcd<hi>e
$ set -- 1
$ echo abcde | sed 's/./&<hi>/'"$1"
a<hi>bcde
答案2
以下对我有用:
#!/bin/sh
n=$1
echo 12345 | sed -r "s/(^.{$n})/\1hi/"
这需要使用-r
sed 选项来指定扩展正则表达式(-E
在 macos 上)。我不确定您的输入将如何输入到脚本中(12345
),所以我只是将其保留为您在示例中的样子。