我有这个:
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