1

我正在尝试匹配这个字符串

'12.34.5.6',#### OR
'12.34.5.6', #### (Note the space after the comma) 

在一系列文件中,并将#### 替换为 2222。

我从小处着手,这条命令成功将 1234 改为 2222

sed -i 's/'12.34.5.6\''\,1234/'12.34.5.6\''\, 2222/g' file.txt

所以我继续用正则表达式替换 1234,下面是我尝试过但不起作用的一些命令。

sed -i 's/'12.34.5.6\''\,\(\s?[0-9]{4,5}\)/'12.34.5.6\''\, 2222/g' file.txt
sed -i 's/'12.34.5.6\''\,[0-9][0-9][0-9][0-9][0-9]?/'12.34.5.6\''\, 2222/g' file.txt

有人可以帮我解决这个问题或提供一些指示吗?

4

2 回答 2

0
sed -r "s/('12[.]34[.]5[.]6',[ ]?)[0-9]{4}/\\12222/g"
于 2012-11-20T01:31:28.140 回答
0

这可能会奏效:

sed -E "s/('12.34.5.6',\s?)[0-9]{4,5}/\12222/g"

例子:

$ echo "'12.34.5.6', 2134" | sed -E "s/('12.34.5.6',\s?)[0-9]{4,5}/\12222/g"
'12.34.5.6', 2222
$ echo "'12.34.5.6',9230" | sed -E "s/('12.34.5.6',\s?)[0-9]{4,5}/\12222/g"
'12.34.5.6',2222

说明:

由于-E我们要求sed使用扩展的正则表达式(但这主要是一个口味问题),正则表达式的开头相当简单:'12.34.5.6',只需匹配相同的字符串。然后我们添加一个空格,后跟一个?表示它是可选的。第一部分包含在大括号中,以便能够在替换模式中使用它。

然后,我们将#'s 添加到模式中。#根据您对[0-9]{4,5}and的尝试,我假设您使用's 代替数字[0-9][0-9][0-9][0-9][0-9]

最后,在替换模式中,我们使用之前匹配的第一对花括号\1,并添加我们2的 's: \12222(这将替换数字 ( #'s),因为没有包含在花括号中,所以在此过程中被丢弃)。

PS。下次请格式化您的问题以获得更好的可读性。聚苯乙烯。我认为这里真正的问题不是正则表达式,而是在你的正则表达式中转义的引号。也许看看[这个问题]。

于 2012-11-20T01:18:05.113 回答