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

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

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

This line is removed by the admin.

搜索关键字是text_to_be_replace

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


当前回答

将包含指定字符串的整行替换为该行的内容

文本文件:

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>/'

这和上面那个很相似。

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

以上答案:

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

注意使用双引号而不是单引号。

要做到这一点,不依赖任何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

你需要在前后使用通配符(.*)来替换整行:

sed 's/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./'