我有一个测试文件,该文件中有大约 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
是一个范围(从N
到M
),不适用于单行号列表。
另一种方法是使用printf
和sed
:
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