用 sed 替换特定行中的字符串

用 sed 替换特定行中的字符串

我确实知道如何替换特定行中的字符串,例如:

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/
        }

相关内容