我有一个文本文件,其中有一行
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实现这一点?
当前回答
在我的makefile中,我使用这个:
@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md
PS:不要忘记-i实际上改变了文件中的文本…因此,如果你定义为“Revision”的模式将改变,你也将改变模式来替换。
示例输出:
abc项目由John Doe撰写 修改:1190
因此,如果你设置模式“Revision: 1190”,这显然与你将它们定义为“Revision:”不同……
其他回答
您可以使用change命令替换整行,并使用-i标志进行适当的更改。例如,使用GNU sed:
sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
将包含指定字符串的整行替换为该行的内容
文本文件:
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:] 字符类和括号表达式
这招对我很管用:
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>/'
cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file
done
Find_replace文件包含2列,c1为匹配模式,c2为替换,sed循环替换包含变量1的模式之一的每一行
这个公认的答案并不适合我,原因如下:
我的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