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

Если вы еще ничего не сохранили, нажмите клавишу UNDO "U".

Вы также можете попробовать проверить файл подкачки.  Он должен иметь имя yourfilename.swp или . yourfilename.swp, в том же каталоге или /var/tmp.  Обязательно используйте ls -la в случае, если имя начинается с . .

Сделайте копию и откройте ее, чтобы проверить содержимое.

0
25.09.2017, 15:51
2 ответа
$ 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, но вы будете печатать пустые строки, если любая строка ввода имеет менее 3 полей

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

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

2
28.01.2020, 02:15

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

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

Это удалит -X-Xв конце каждой строки в 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в массиве, удаление выполняется для всех элементов массива.

4
28.01.2020, 02:15

Теги

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