linux sed替换行,shell - 使用Sed替换包含字符串的整行

shell - 使用Sed替换包含字符串的整行

我有一个文本文件,其中有一个特定的行

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

我需要替换上面的整行

This line is removed by the admin.

搜索关键字是sed

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

Rahul asked 2019-03-02T17:31:36Z

10个解决方案

382 votes

您可以使用change命令替换整行,并使用-i标志进行就地更改。 例如,使用GNU sed:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

Todd A. Jacobs answered 2019-03-02T17:31:47Z

113 votes

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

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

Thor answered 2019-03-02T17:32:23Z

17 votes

由于以下几个原因,接受的答案对我不起作用:

我的sed版本不喜欢c\,其长度为零

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)

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

skensell answered 2019-03-02T17:33:24Z

8 votes

上面的答案:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

如果替换字符串/行不是变量,则工作正常。

问题是在Redhat 5之后的\之后的c逃脱了\.双c也没有工作(至少在Redhat 5上)。

通过点击和试用,我发现如果您的替换字符串/行只是一行,c之后的\是多余的。 所以我在c之后没有使用\,使用变量作为单个替换线并且很高兴。

代码看起来像:

sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo

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

user4256255 answered 2019-03-02T17:34:26Z

1 votes

在我的makefile中我用这个:

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

PS:不要忘记-i实际上改变了文件中的文本...所以如果你定义为“修订版”的模式会改变,你也会改变要替换的模式。

输出示例:

Abc-Project由John Doe撰写

修订:1190

因此,如果您设置模式“Revision:1190”,它显然与您将它们定义为“Revision:”仅相同...

Martin Pfeffer answered 2019-03-02T17:35:22Z

1 votes

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

'

它工作正常

nkl answered 2019-03-02T17:35:48Z

1 votes

到目前为止提供的所有答案都假设您知道要替换的文本,这是有意义的,因为这是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/'

b_laoshi answered 2019-03-02T17:36:22Z

1 votes

cat find_replace | while read pattern replacement ; do

sed -i "/${pattern}/c ${replacement}" file

done

find_replace文件包含2列,c1与模式匹配,c2与替换,sed循环替换每行包含变量1的模式之一

sjordi answered 2019-03-02T17:36:49Z

0 votes

它与上面的类似......

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

Annapureddy Hari answered 2019-03-02T17:37:15Z

0 votes

我经常使用正则表达式从我刚刚使用的文件中提取数据,用\"替换文字引号\" :-)

cat file.csv | egrep '^\"([0-9]{1,3}\.[0-9]{1,3}\.)' | sed s/\"//g | cut -d, -f1 > list.txt

staM answered 2019-03-02T17:37:42Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值