我确实知道如何替换特定行中的字符串,例如:
sed -i "<line number>s/<old string>/<new string>/g" <file name>
但是我不知道如何替换多行中的字符串,例如从行号 1 然后 10 然后 100
答案1
据我所知,sed 地址可能只包含一行,或者一个范围的线路。
sed -f -
但是,您可以使用从标准输入读取命令以及 shell 来拼凑一些东西。例如:
printf '%ds/<old string>/<new string>/g\n' {1,10,100} | sed -f - file
答案2
这是 awk 的答案。
awk 'NR == 1 || NR == 10 || NR == 100 {gsub(/old/,"new")}; {print}' <file name>
解释
NR == 1 || NR == 10 || NR == 100
:仅在这些行之一上执行以下命令。gsub(/old/,"new")
: 替换/old/
为new
.{print}
:无论您在哪一行,都打印该行。
答案3
直接使用 sed 的替代方案:
sed '1b1; 10b1; 100b1; b ;:1;s/<old string>/<new string>/g' <file name>
如果行号匹配 1、10 或 100,则分支到标签 1;在其他行上,只需分支到末尾(默认情况下,打印该行)。
有点自动化:
sed -e $(printf '%sb1;' 1 10 100) -e 'b; :1;s/<old>/<new>/g' <file name>
POSIXly(使用默认 IFS):
sed $(printf -- '-e %sb1 ' 1 10 100) -e 'b' -e':1' -e 's/<old>/<new>/g'
答案4
嗯,怎么样:
sed -e '
/something_identifying_startline/,/something_identifying_endline/{
s/dog/cat/
s/black/white/
}