Удалите строку, используя определенные значения (-)

У меня есть следующий текст

Foo-11,11-fo.o-Foo-бар

бар-Foo-11.11-22.11

Я хочу удалить последние строки с двумя «-».

Ожидаемый результат:

Foo-11,11-fo.o

бар-Foo

Я пробовал несколько методов, используя cut, но ничего не работает.

$ cat ip.txt foo-11.11-fo.o-foo-bar bar-foo-11.11-22.11 $ rev ip.txt rab-oof-o.of-11.11-oof 11.22-11.11-oof-rab $ rev ip.txt | cut -d- -f3- | rev foo-11.11-fo.o bar-foo 

Переверните каждую строку, затем используйте cut чтобы выбрать все поля, кроме первых двух, и затем снова отменить вывод

Вы также можете использовать perl , но печатаете пустые строки, если какая-либо строка ввода имеет менее трех полей

 $ perl -F'-' -lane 'print join "-", @F[0..$#F-2]' ip.txt foo-11.11-fo.o bar-foo 

Укажите - как разделитель входных данных и затем распечатайте все, кроме последних двух полей

Использование sed :

 $ sed 's/-[^-]*-[^-]*$//' file foo-11.11-fo.o bar-foo 

Это приведет к удалению -XX в конце каждой строки в file , где X – любая строка, которая не содержит.

Если строки находятся в переменной оболочки:

 $ s='foo-11.11-fo.o-foo-bar' $ printf '%s\n' "${s%-*-*}" foo-11.11-fo.o $ s='bar-foo-11.11-22.11' $ printf '%s\n' "${s%-*-*}" bar-foo 

или в массиве bash :

 $ s=( 'foo-11.11-fo.o-foo-bar' 'bar-foo-11.11-22.11' ) $ printf '%s\n' "${s[@]%-*-*}" foo-11.11-fo.o bar-foo 

Это удаляет все, что соответствует шаблону -*-* в конце строки переменной s через совпадение / удаление шаблона суффикса. В случае, когда s в массиве, удаление выполняется для всех элементов массива.