我有一个文本文件,其中有一行
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
我需要将上面的整行替换为
This line is removed by the admin.
搜索关键字是text_to_be_replace
我需要为此写一个shell脚本。如何使用sed实现这一点?
我有一个文本文件,其中有一行
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
我需要将上面的整行替换为
This line is removed by the admin.
搜索关键字是text_to_be_replace
我需要为此写一个shell脚本。如何使用sed实现这一点?
当前回答
用于配置文件的操作
我受到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
其他回答
用于配置文件的操作
我受到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
到目前为止提供的所有答案都假设您了解要替换的文本,这是有意义的,因为这是OP所要求的。我提供的答案假设您对要替换的文本一无所知,并且文件中可能有与您不希望被替换的内容相同或类似的单独行。此外,我假设您知道要替换的行号。
下面的例子演示了如何通过特定的行号删除或更改文本:
# replace line 17 with some replacement text and make changes in file (-i switch)
# the "-i" switch indicates that we want to change the file. Leave it out if you'd
# just like to see the potential changes output to the terminal window.
# "17s" indicates that we're searching line 17
# ".*" indicates that we want to change the text of the entire line
# "REPLACEMENT-TEXT" is the new text to put on that line
# "PATH-TO-FILE" tells us what file to operate on
sed -i '17s/.*/REPLACEMENT-TEXT/' PATH-TO-FILE
# replace specific text on line 3
sed -i '3s/TEXT-TO-REPLACE/REPLACEMENT-TEXT/'
这个公认的答案并不适合我,原因如下:
我的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 -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
如果替换字符串/行不是变量,工作正常。
问题是在Redhat 5上,c后面的\转义了$。双\\也不起作用(至少在红帽5上)。
通过hit和trial,我发现如果替换字符串/行只有一行,那么c后面的\是多余的。所以我没有在c后面使用\,使用一个变量作为单一的替换行,它是joy。
代码看起来像这样:
sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo
注意使用双引号而不是单引号。
下面的命令对我有用。哪个是处理变量的
sed -i "/\<$E\>/c $D" "$B"