Заменить 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
Другие вопросы по тегам