![将正则表达式匹配替换为包含匹配的字符串](https://linux22.com/image/69160/%E5%B0%86%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%8C%85%E5%90%AB%E5%8C%B9%E9%85%8D%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个文本为的文件
Afghanistan=+93
Albania=+355
Algeria=+213
American Samoa=+1
Andorra=+376
Angola=+244
它包含所有国家/地区列表及其拨号代码。
我想更换:
Afghanistan=+93
和Afghanistan(+93)=+93
我可以获得选择模式为=\+[0-9]*
,但是替换模式字符串是什么?
我知道\1
这是捕获的选择匹配,但它似乎不适用于sed
.所以正则表达式需要有选择。
我如何使用 sed 或任何其他 UNIX 工具来做到这一点?
答案1
sed 's/=\(+[0-9]\{1,3\}\)/(\1)=\1/'
为了解决您的问题(据我所知):
需要记住的模式sed
应括在括号中 - 它们的外观定义了它们的索引号。例如:
sed 's/\(<memorized_pattern_1>\)<not_memorized>\(<memorized_pattern_2>\)/\2\1/'
将交换模式 1 和 2 并删除中间的模式。
答案2
sed 's/=\([^= ]*\) *$/(\1)&/' <in >out
上面的代码将仅替换一行中最后一个等号以及首先跟随的所有字符...
以下内容的副本不是由两个括号包围的空间(如果一行中有任何尾随空格)
整个匹配模式再次出现。
在右手侧(替换的替换字段s///
) \1
表示第一个\(
分组捕获\)
并将&
整个匹配模式表示为一个组。所以...
sed 's/=\([^= ]*\) *$/(\1)&/' <<\IN
Afghanistan=+93
Albania=+355
Algeria=+213
American Samoa=+1
Andorra=+376
Angola=+244
IN
Afghanistan(+93)=+93
Albania(+355)=+355
Algeria(+213)=+213
American Samoa(+1)=+1
Andorra(+376)=+376
Angola(+244)=+244
答案3
使用那个:
sed 's/=\(+[0-9]\+\)/(\1)=\1/' file
它搜索后跟=+
至少一位数字 ( [0-9]\+
) 并用所需格式 ( (\1)=\1
) 替换所有数字。
答案4
假设所有数据都在名为 file 的文件中,那么
awk -F "=" '{print $1"("$2")="$2}' file