使用sed替换仅包含特定字符串的行

时间:2013-07-03 09:01:09

标签: replace sed line

您好我在文本文件中有这些拖曳线:

debug "run_rc_script $_rc_elem faststop"
run_rc_script $_rc_elem faststop

我只想用第二行代替SOME_TEXT。我用

sed -i '' -e's|run_rc_script $_rc_elem faststop|SOME_TEXT|' /fu/bar

但两条线路都在变化。我该怎么办?

2 个答案:

答案 0 :(得分:2)

为行首添加^。这样,它只会将开始的行与run_rc_script...匹配:

sed -i '' -e's|^run_rc_script $_rc_elem faststop|SOME_TEXT|' /fu/bar

测试

$ sed 's|^run_rc_script $_rc_elem faststop|SOME_TEXT|' file
debug "run_rc_script $_rc_elem faststop"
SOME_TEXT

更新

  

你知道,有一点问题。这两行以制表符开头。   我该怎么办?

作为Kent suggests,请使用^\s*

$ sed 's|^\s*run_rc_script $_rc_elem faststop|SOME_TEXT|' file
        debug "run_rc_script $_rc_elem faststop"
SOME_TEXT

需要在sed上转义$

$ echo "hello$bye" | sed "s|hello$bye|adeu|g"
adeu
$ echo "hello$bye" | sed 's|hello$bye|adeu|g'
hello

答案 1 :(得分:0)

在模式前添加一点^来表示行的开始。

sed -e's|^run_rc_script $_rc_elem faststop|SOME_TEXT|' /fu/bar

编辑:

如果行以TAB字符开头,您可以在模式中指定:

sed -e's|^\trun_rc_script $_rc_elem faststop|SOME_TEXT|' /fu/bar

为了保留前导空格/制表符,请尝试:

sed -e's|^\([ \t]\+\)trun_rc_script $_rc_elem faststop|\1SOME_TEXT|' /fu/bar