首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sed中的regex查找和替换文件中的字符串。脚本不工作

使用sed中的regex查找和替换文件中的字符串。脚本不工作
EN

Stack Overflow用户
提问于 2016-10-05 15:54:49
回答 3查看 112关注 0票数 1

我有一个文件,在该文件中,我必须根据特定的模式(电话号码)查找和更改字符串。准则是:

代码语言:javascript
复制
^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$

当我在指挥中使用它时:

代码语言:javascript
复制
grep "^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$" -E filename

它起作用了。但是,当我试图用sed中的所有括号替换所有空格并在13和15位置添加空格时,它不起作用,我也不知道为什么。

我的变体是:

代码语言:javascript
复制
sed '/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/s/[()]//' filename

(仅用于替换括号)

代码语言:javascript
复制
sed -e '/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/s/[()]//' -e '/^+[0-9]{2} ([0-9]{2}) [0-9]{7}/s/./& /11;s/./& /14' filename

档案结构:

代码语言:javascript
复制
    +380 44 123 45 67
    +380 (44) 1234567
    +350 (56) 1454557
    +330 (76) 1255557
    +380 44 3534 45 67
    +320 (45) 1237887
    +310 (54) 1939997
    adasd
    asdddddddddddd
    sssdad

预期产出:

代码语言:javascript
复制
    +380 44 123 45 67
    +380 44 123 45 67
    +350 56 145 45 57
    +330 76 125 55 57
    +380 44 3534 45 67
    +320 45 123 78 87
    +310 54 193 99 97
    adasd
    asdddddddddddd
    sssdad
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-05 16:15:24

有一种方法可以做到:

代码语言:javascript
复制
$ cat ip.txt 
+380 44 123 45 67
+380 (44) 1234567
+350 (56) 1454557
+330 (76) 1255557
+380 44 3534 45 67
+320 (45) 1237887
+310 (54) 1939997
adasd
asdddddddddddd
sssdad

$ sed -E 's/^(\+[0-9]{3}) \(([0-9]{2})\) ([0-9]{3})([0-9]{2})([0-9]{2})$/\1 \2 \3 \4 \5/' ip.txt 
+380 44 123 45 67
+380 44 123 45 67
+350 56 145 45 57
+330 76 125 55 57
+380 44 3534 45 67
+320 45 123 78 87
+310 54 193 99 97
adasd
asdddddddddddd
sssdad
  • 可以使用()环绕一个模式,以便在替换部分中可以反向引用它们中匹配的文本。
  • \1对应于第一个这样的捕获组,\2对应于第二个,等等。
  • 为了匹配()本身,我们需要像\(\)那样使用转义
  • 因此,这里的数字是按照所需的输出捕获的,不包括输入行中的(),因此它们不是输出的一部分。
票数 1
EN

Stack Overflow用户

发布于 2016-10-05 16:08:22

您的sed命令是错误的。我的方式:

代码语言:javascript
复制
sed -E 's/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/[()]/'
票数 0
EN

Stack Overflow用户

发布于 2016-10-05 16:17:59

使用:

代码语言:javascript
复制
sed -e 's|[()]||g' so-tel.txt | sed -E 's|([0-9]{3})([0-9]{2})([0-9]{2})|\1 \2 \3|'

转换so-tel.txt

代码语言:javascript
复制
+380 44 123 45 67
+380 (44) 1234567
+350 (56) 1454557
+330 (76) 1255557
+380 44 3534 45 67
+320 (45) 1237887
+310 (54) 1939997
adasd
asdddddddddddd
sssdad

转入:

代码语言:javascript
复制
+380 44 123 45 67
+380 44 123 45 67
+350 56 145 45 57
+330 76 125 55 57
+380 44 3534 45 67
+320 45 123 78 87
+310 54 193 99 97
adasd
asdddddddddddd
sssdad

解释:

代码语言:javascript
复制
's|[()]||g'

在全球范围内,将任何()替换为零

代码语言:javascript
复制
's|([0-9]{3})([0-9]{2})([0-9]{2})|\1 \2 \3|'

替换并捕获长度为3、2和2的七个连续数字,用空格分隔捕获的数字组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39878653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档