Заменить 4-е вхождение регулярного выражения в строке
Это выход у меня сейчас. Как я могу получить от ввода до вывода?
Входные данные:
1.2.3.4.5
2.3.4.5.6
Выход:
1.2.3.4-5
2.3.4.5-6
Бонус: у меня есть остальные 80% сценария, но это мой идеальный результат. Есть ли супер простой способ сделать это?
Входные данные:
1.2.3.4-1.2.3.10
Выход:
1.2.3.4-10
3 ответа
С awk
:
awk -F '[-.]' '{printf "%s.%s.%s.%s-%s\n", $1, $2, $3, $4, $NF}'
Поскольку, похоже, вы хотите, чтобы поля 1-4 и последнее поле ввода были отделены либо .
или же -
и выходные данные отформатированы со всеми, кроме последнего поля, разделенными .
,
Более кратко:
awk -F '[-.]' -v OFS=. '{$4 = $4"-"$NF; NF=4}1'
- Добавьте последнее поле в четвертое поле и установите количество полей равным 4.
Первая часть:
$ sed 's/\./-/4' file.txt
Что заменяет 4-е вхождение .
с -
,
Для вашего Бонусного раздела:
sed -r 's/(.*)-.*\.(.*)$/\1-\2/' file.txt
вход:
1.2.3.4-1.2.3.10
выход:
1.2.3.4-10
Мы можем использовать группировку с жадным соответствием с помощью sed следующим образом:
$ sed -r 's/(.*)\.(.*)$/\1-\2/' input.txt
1.2.3.4-5
2.3.4.5-6
Та же идея для Perl:
$ perl -pe's/(.*)\.(.*)$/\1-\2/' input.txt
1.2.3.4-5
2.3.4.5-6
Но мы можем поиграть с .
в качестве разделителя столбцов в awk:
$ awk -F '.' 'BEGIN{OFS=FS}{$NF=-$NF;sub(/\.-/,"-");print}' input.txt
1.2.3.4-5
2.3.4.5-6