Найти часть текста в строке, а затем добавить ее в другую часть той же строки

Найти часть текста в строке, а затем добавить ее в другую часть той же строки

У меня есть это:

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

Связанный контент