shell 替换整行字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 替换整行字符串相关的知识,希望对你有一定的参考价值。

现在有一个文件abc.m,想要替换其中一行的最后一个数字,但是最后一个数字是不确定的,比如:#define ABC 3,想要把3替换为a,每次3这个位置的数字都是不固定的,求问怎么用shell命令解决
谢谢

如果知道在哪一行,可以用

sed -i '2s/\\(.*\\)[0-9]$/\\1a/' abc.m

2是要处理的行号,  

s/  a  /  b   /         用b替换a

\\(.*\\)[0-9]$          正则表达,前面一部分放捕获里面,末尾跟着一个数字

\\1a         是替换项,\\1代表前面的捕获,a就是字面的意思

例如:

参考技术A  sed  's/[0-9]$/a/' abc.m

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

【中文标题】sed / awk 匹配文件中第二次出现的正则表达式,并替换整行【英文标题】:sed / awk match second occurrence of regex in a file, and replace whole line 【发布时间】:2022-01-06 17:47:05 【问题描述】:

尝试让 sed 或 awk 执行以下操作:

    浏览文件 捕获字符串 + 正则表达式 (remote_addrs.*) 将整行替换为不同的内容,因此“包含“remote_addrs”及其后的任何内容的行”替换它。

示例文件:

dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 2.2.2.2
woodchuck

想要改成这样: 示例文件:

dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 3.3.3.3
woodchuck

尝试使用以下方法:

sed -z 's/remote_addrs.*/remote_addrs\ =\ 3.3.3.3/2' file
sed ':a;N;$!ba;s/remote_addrs.*/remote_addrs\ =\ 3.3.3.3/2' file

但 sed 拒绝在那次发生后替换所有内容。这似乎只适用于单个字符串。

必须不提供具体行号的情况下完成,“remote_addrs”的行位置必须是可变的。

【问题讨论】:

你为什么要逃离这个空间,尤其是3\3 是对第 3 组的反向引用,并且您的正则表达式中没有单个组。 @WiktorStribiżew woops,已编辑,“\”在错误的位置。谢谢。 【参考方案1】:

使用 awk 你可以试试这个

$ cat file
dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 2.2.2.2
woodchuck

$ awk 'set==1 && /remote_addrs/ $0="remote_addrs = 3.3.3.3" 
    /remote_addrs/ set=1  1' file
dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 3.3.3.3
woodchuck

【讨论】:

【参考方案2】:

虽然 Wiktor 的不错的解决方案已被接受,但 awk 解决方案如何(JFYI):

awk '/remote_addrs.*/ && c++==1 sub(/remote_addrs.*/, "remote_addrs = 3.3.3.3") 1' file
正则表达式的第一个匹配项只是增加变量c 而不调用... 中的语句。 第二个匹配执行sub() 语句。 最后的1 告诉awk 打印当前记录。

【讨论】:

【参考方案3】:

您使用的是 GNU sed,所以我也发布了 GNU sed 解决方案:

sed -z 's/remote_addrs.*/remote_addrs = 3.3.3.3/2m' file

注意:

\3(在您现在编辑的问题的初始版本中使用)是对第 3 组的反向引用,并且您的正则表达式中没有单个组。所以,应该删除逃逸 您无需转义空格 \z 使换行符成为模式空间的一部分,因此. 匹配它们。您需要打开“多行”模式,并添加m 标志,使. 模式无法匹配换行符。

见online demo:

#!/bin/bash
s='dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 2.2.2.2
woodchuck'
 
sed -z 's/remote_addrs.*/remote_addrs = 3.3.3.3/2m' <<< "$s"

输出:

dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 3.3.3.3
woodchuck

【讨论】:

"你需要打开"多行"模式,并添加 m" 就是这样!非常感谢:)

以上是关于shell 替换整行字符串的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本之sed使用----替换变量转义字符

转载:shell脚本之sed使用----替换变量转义字符

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

sed调用shell变量及替换包含关键字的整行

问在LINUX中 如何用sed将整行替换成给定字符串

用 sed 找到匹配时替换整行