如何在sed中通过部分匹配复制整个单词

4

我有一个文件,每一行都具有以下格式:

foo         tc_TESTNAME,  // TEST #1

我希望在每一行中复制tc_TESTNAME,具体如下:
foo         tc_TESTNAME tc_TESTNAME,  // TEST #1

以下sed命令只会复制单词匹配部分:
# sed -e "s/(tc_*)/& &/"
foo         tc_ tc_TESTNAME,  // TEST #1

什么是正确的正则表达式语法来复制整个单词?
2个回答

3
正则表达式的正确语法以重复整个单词为例是什么?
您尝试使用以下sed命令:
sed -e "s/(tc_*)/& &/"

这将只复制后面带0个或多个下划线的tc。但是你想要匹配的是以tc_开头,直到下一个逗号或空格的任何内容。

考虑到这一点,下面的sed应该适合您:

s='foo         tc_TESTNAME,  // TEST #1'
sed 's/tc_[^[:blank:],]*/& &/g' <<< "$s"

foo         tc_TESTNAME tc_TESTNAME,  // TEST #1

[^[:blank:],]* 匹配0或多个非空白字符且非逗号的任意字符。

请注意,对于此sed命令,无需使用扩展正则表达式模式。


2
请使用您提供的示例,尝试以下sed程序。
sed -E 's/(tc_[^,]+)/\1 \1/' Input_file

或者:为了匹配以tc开头的确切单词,只需在正则表达式中确保有空格,以防您可能有其他字符串。

sed -E 's/ (tc_[^,]+)/ \1 \1/'  Input_file

说明:使用-E选项启用ERE(扩展正则表达式),在主程序中使用s选项执行替换。然后匹配(tc_[^,]+),捕获从tc_开始到下一个逗号之前的内容,并将此值捕获到第1个捕获组中。在进行替换时,按照所需的输出格式将其替换为自身空格和自身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接