查找一行中的部分文本,然后将其添加到同一行的另一部分

查找一行中的部分文本,然后将其添加到同一行的另一部分

我有这个:

Issue #12345: some more text here https://some.domain/some/path

我想找到 12345 位(这是动态的 - 因此需要通过正则表达式),然后将其添加到同一行的末尾。就像这样:

Issue #12345: some more text here https://some.domain/some/path/12345

我怎样才能使用 sed/awk 实现这一点?

PS:我环顾四周,但唯一类似的问题是:用同一字符串的另一部分替换字符串的一部分...但它缺少正则表达式位。

答案1

假设您的输入位于文件 test.txt 中,则以下命令应该有效

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

如果您不直接从文件中读取,

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

输出:

Issue #12345: some more text here https://some.domain/some/path/12345

该命令的作用:

^(.*)从文件开头开始并抓取所有内容,直到下一个匹配 ([[:digit:]]{5})匹配接下来的 5 位数字 (.*)$抓取所有内容,直到文件末尾 \1\2\3\/\2每个匹配的组都编号(在本例中为 1-3),然后我们格式化输出以获取原始文本(匹配 1-3),“/”,然后是第二个匹配。

如果您能更具体地描述您的问题,以供将来参考,那将是理想的选择。例如,假设您正在查找一行中的前 5 位数字,并希望将这些数字(带有前面的斜杠)添加到该行的末尾,并对输入中的每一行都执行此操作。我以为这就是你的意思。如果没有,您可能需要更新您的问题以使其更加具体。

您可能还想列出您所做的一些尝试,而不仅仅是引用以前的问题。还可以帮助我们更好地了解您正在尝试做什么。

答案2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

或者,如果您sed必须-E处理模式中的扩展正则表达式,

sed -E 's,([[:digit:]]+).*,&/\1,' file

替换表达式sed找到该行上的第一个正整数(数字字符串)并捕获它。它还匹配从该点到该行末尾的该行的其余部分。表达式的替换部分将行的匹配位替换为匹配的所有内容 ( &),后跟斜杠和捕获的数字字符串。

我使用逗号作为表达式中的分隔符,因为替换部分包含斜杠,但我也可以将命令编写为

sed -E 's/([[:digit:]]+).*/&\/\1/' file

上面的命令将对所有输入行执行替换。要将其限制为仅以字符串开头的行Issue #,请使用

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

答案3

我已经通过以下方法完成了

命令

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

输出

Issue #12345: some more text here https://some.domain/some/path/12345

相关内容