如何使用 sed 替换多个字符?

如何使用 sed 替换多个字符?

我有这个脚本:

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是时3sed表达式将如下所示

s/./&hi/3

这会将(任何字符)的第三个匹配替换.为相同的字符(这就是&替换中的内容),后跟hi.

像这样在命令n末尾放置一个数字, 可以替换模式的第 :th 匹配项。ssedsedn

测试运行(出于可读性原因,修改了输入并进行了替换):

$ 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/"

这需要使用-rsed 选项来指定扩展正则表达式(-E在 macos 上)。我不确定您的输入将如何输入到脚本中(12345),所以我只是将其保留为您在示例中的样子。

相关内容