Замените 4-е возникновение regex в строке

Это - вывод, который я имею теперь. Как я могу добраться от Входа для Вывода?

Вход:

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
-1
задан 19 June 2017 в 10:01

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.
1
ответ дан 3 November 2019 в 01:43

Первая часть:

$ sed 's/\./-/4' file.txt

, Который заменяет 4-е возникновение . с -.

<час>

Для Вашего раздела Bonus:

sed -r 's/(.*)-.*\.(.*)$/\1-\2/' file.txt

вход:

1.2.3.4-1.2.3.10

вывод:

1.2.3.4-10
0
ответ дан 3 November 2019 в 01:43

Мы можем использовать группировку с жадным соответствием с sed как так:

$ sed -r 's/(.*)\.(.*)$/\1-\2/' input.txt                                
1.2.3.4-5
2.3.4.5-6

Та же идея для жемчуга:

$ 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
0
ответ дан 3 November 2019 в 01:43

Другие вопросы по тегам:

Похожие вопросы: