我有一个文件,在该文件中,我必须根据特定的模式(电话号码)查找和更改字符串。准则是:
^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$当我在指挥中使用它时:
grep "^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$" -E filename它起作用了。但是,当我试图用sed中的所有括号替换所有空格并在13和15位置添加空格时,它不起作用,我也不知道为什么。
我的变体是:
sed '/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/s/[()]//' filename(仅用于替换括号)
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档案结构:
+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预期产出:
+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发布于 2016-10-05 16:15:24
有一种方法可以做到:
$ 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对应于第二个,等等。(或)本身,我们需要像\(和\)那样使用转义(),因此它们不是输出的一部分。发布于 2016-10-05 16:08:22
您的sed命令是错误的。我的方式:
sed -E 's/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/[()]/'发布于 2016-10-05 16:17:59
使用:
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
+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转入:
+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解释:
's|[()]||g'在全球范围内,将任何(和)替换为零
's|([0-9]{3})([0-9]{2})([0-9]{2})|\1 \2 \3|'替换并捕获长度为3、2和2的七个连续数字,用空格分隔捕获的数字组。
https://stackoverflow.com/questions/39878653
复制相似问题