我想使用 sed 命令编辑特定行(多行)



我有一个测试文件,该文件中有大约 20K 行,我想更改特定行中的某些特定字符串,我正在获取要更改的行号和字符串。在这里,我有一个场景,我想在多行中将一个字符串更改为另一个字符串。我之前用过喜欢

sed -i '12s/stringone/stringtwo/g'   filename

但在这种情况下,我必须为同一个测试运行多个命令,例如

sed -i '15s/stringone/stringtwo/g'   filename
sed -i '102s/stringone/stringtwo/g'   filename
sed -i '11232s/stringone/stringtwo/g'   filename

比我在下面尝试的

sed -i '12,15,102,11232/stringone/stringtwo/g' filename

但是我收到错误

sed: -e expression #1, char 5: unknown command: `,'

请有人帮助我实现这一目标。

要获得您尝试使用 GNU sed 获得的功能,请在 GNU awk 中这样做:

awk -i inplace '
BEGIN {
split("12 15 102 11232",tmp)
for (i in tmp) lines[tmp[i]]
}
NR in lines { gsub(/stringone/,"stringtwo") }
' filename

就像使用 sed 脚本一样,当字符串包含正则表达式或反向引用元字符时,上述操作将失败。如果这是一个问题,那么使用 awk,您可以将 gsub() 替换为 index() 和 substr() 进行字符串文字操作(sed 不支持)。

您会收到错误,因为sed中的N,M是一个范围(从NM),不适用于单行号列表。

另一种方法是使用printfsed

sed -i "$(printf '%ds/stringone/stringtwo/g;' 12 15 102 11232)" filename

printf 语句对参数中N的所有数字重复模式Ns/stringone/stringtwo/g;

这可能对你有用(GNU sed):

sed '12ba;15ba;102ba;11232ba;b;:a;s/pattern/replacement/' file

对于每个地址,分支到一个公共占位符(在本例中为:a)并执行替换,否则将脱离 sed 循环。

如果地址在文件中:

sed 's/.*/&ba/' fileOfAddresses | sed -f - -e 'b;:a;s/pattern/replacement/' file 

最新更新