我有一个文本文件,其中有一行
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实现这一点?
当前回答
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
这招对我很管用:
sed -i <extension> 's/.*<Line to be replaced>.*/<New line to be added>/'
一个例子是:
sed -i .bak -e '7s/.*version.*/ version = "4.33.0"/'
-i:替换后备份文件的扩展名。在本例中,它是.bak。 -e: sed脚本。在本例中,它是'7s/.*版本。*/ version = "4.33.0"/'。如果您想使用sed文件,请使用-f标志 s:要替换的文件中的行号。在本例中,它是7s,也就是第7行。
注意:
如果你想做一个递归查找和替换sed,那么你可以grep到命令的开头:
grep -rl --exclude-dir=<directory-to-exclude> --include=\*<Files to include> "<Line to be replaced>" ./ | sed -i <extension> 's/.*<Line to be replaced>.*/<New line to be added>/'
将包含指定字符串的整行替换为该行的内容
文本文件:
Row: 0 last_time_contacted=0, display_name=Mozart, _id=100, phonebook_bucket_alt=2
Row: 1 last_time_contacted=0, display_name=Bach, _id=101, phonebook_bucket_alt=2
单一的字符串:
$ sed 's/.* display_name=\([[:alpha:]]\+\).*/\1/'
output:
100
101
由空格分隔的多个字符串:
$ sed 's/.* display_name=\([[:alpha:]]\+\).* _id=\([[:digit:]]\+\).*/\1 \2/'
output:
Mozart 100
Bach 101
调整regex以满足您的需要
[:alpha]和[:digit:] 字符类和括号表达式
您可以使用change命令替换整行,并使用-i标志进行适当的更改。例如,使用GNU sed:
sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
要做到这一点,不依赖任何GNUisms,如-i不带参数或c不带换行符:
sed '/TEXT_TO_BE_REPLACED/c\
This line is removed by the admin.
' infile > tmpfile && mv tmpfile infile
在这种(POSIX兼容的)命令形式中
c\
text
文本可以由一行或多行组成,应该成为替换的一部分的换行符必须转义:
c\
line1\
line2
s/x/y/
其中s/x/y/是一个新的sed命令后,模式空间已替换为两行
line1
line2