извлечение строки из строки в Unix - PullRequest
0 голосов
/ 29 мая 2018

У меня есть файл с содержанием:

code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}

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

code_name:00:12 29.05.2018 {1705}

Я пытаюсь выполнить команду ниже, но это не дает результата:

sed '/\bvertical.*\]/d' file_name

Я что-то упустил?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Несмотря на то, что вопрос не был помечен awk, с помощью этого инструмента легко извлечь некоторые столбцы:

awk '{print $1,$(NF-1),$NF}' <<< "code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}"

NF представляет количество полей текущей строки, поэтому $NF - последний элемент этой строки.

0 голосов
/ 29 мая 2018

Если записи в вашем файле всегда имеют такую ​​форму, 8 полей разделены пробелами, то awk может быть более простым решением:

> cat file_name 
  code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}
> cat file_name | awk '{ print $1, $7, $8 }'
  code_name:00:12 29.05.2018 {1705}

Вышеуказанный awk смысл сценария для каждой записи, напечатайте 1-е, 7-е и 8-е поля.

0 голосов
/ 29 мая 2018

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

$ sed 's/\bvertical.*\]//' ip.txt 
code_name:00:12  29.05.2018 {1705}

$ # ] doesn't require escaping
$ sed 's/\bvertical.*]//' ip.txt 
code_name:00:12  29.05.2018 {1705}


Обратите внимание, что * является жадным, поэтому .*] постарается максимально соответствовать

$ echo 'good foo [123] baz [456]' | sed 's/foo.*]//'
good 

$ # this will delete only up to first ] after 'foo'
$ echo 'good foo [123] baz [456]' | sed 's/foo[^]]*]//'
good  baz [456]
...