将正则表达式匹配替换为包含匹配的字符串

将正则表达式匹配替换为包含匹配的字符串

我有一个文本为的文件

Afghanistan=+93
Albania=+355
Algeria=+213
American Samoa=+1
Andorra=+376
Angola=+244

它包含所有国家/地区列表及其拨号代码。

我想更换:

Afghanistan=+93Afghanistan(+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

上面的代码将仅替换一行中最后一个等号以及首先跟随的所有字符...

  1. 以下内容的副本不是由两个括号包围的空间(如果一行中有任何尾随空格)

  2. 整个匹配模式再次出现。

在右手侧(替换的替换字段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

相关内容