我有一个文本文件,其中有一行

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

我需要将上面的整行替换为

This line is removed by the admin.

搜索关键字是text_to_be_replace

我需要为此写一个shell脚本。如何使用sed实现这一点?


当前回答

bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$ 
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
'
'
'
DB_HOSTNAME=good replaced with 122.334.567.90
'

它运行正常

其他回答

bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$ 
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
'
'
'
DB_HOSTNAME=good replaced with 122.334.567.90
'

它运行正常

用于配置文件的操作

我受到skensell答案的启发想出了这个解决方案

保密[搜索][重播][文件]

它将:

如果不存在,则创建该文件 替换searchPattern匹配的整行(所有行) 如果没有找到pattern,则在文件末尾添加replaceLine

功能:

function configLine {
  local OLD_LINE_PATTERN=$1; shift
  local NEW_LINE=$1; shift
  local FILE=$1
  local NEW=$(echo "${NEW_LINE}" | sed 's/\//\\\//g')
  touch "${FILE}"
  sed -i '/'"${OLD_LINE_PATTERN}"'/{s/.*/'"${NEW}"'/;h};${x;/./{x;q100};x}' "${FILE}"
  if [[ $? -ne 100 ]] && [[ ${NEW_LINE} != '' ]]
  then
    echo "${NEW_LINE}" >> "${FILE}"
  fi
}

疯狂的退出状态魔术来自https://stackoverflow.com/a/12145797/1262663

在我的makefile中,我使用这个:

@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md

PS:不要忘记-i实际上改变了文件中的文本…因此,如果你定义为“Revision”的模式将改变,你也将改变模式来替换。

示例输出:

abc项目由John Doe撰写 修改:1190

因此,如果你设置模式“Revision: 1190”,这显然与你将它们定义为“Revision:”不同……

这个公认的答案并不适合我,原因如下:

我的sed版本不喜欢使用0长度扩展的-i c\命令的语法很奇怪,我不能让它工作 我没有意识到我的一些问题来自于未转义的斜杠

以下是我提出的解决方案,我认为它适用于大多数情况:

function escape_slashes {
    sed 's/\//\\\//g' 
}

function change_line {
    local OLD_LINE_PATTERN=$1; shift
    local NEW_LINE=$1; shift
    local FILE=$1

    local NEW=$(echo "${NEW_LINE}" | escape_slashes)
    # FIX: No space after the option i.
    sed -i.bak '/'"${OLD_LINE_PATTERN}"'/s/.*/'"${NEW}"'/' "${FILE}"
    mv "${FILE}.bak" /tmp/
}

因此本例使用提出了修正问题的方法:

change_line "TEXT_TO_BE_REPLACED" "This line is removed by the admin." yourFile

这和上面那个很相似。

sed 's/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./'