У меня есть это:
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