Мне нужно оставить только строки, начинающиеся с «ab»; и не иметь буквы между «ab» и «cd». Из этих строк мне нужно удалить «ab» и «cd».

Вход:

abI am jhoncd
ab32.58cd
abI live in USAcd
ab22. I was born in NYcd
ab58.2cd
ef

Выход:

32.58
58.2

Спасибо, ребята!

awk
0
blue_xylo 27 Июл 2014 в 15:45

4 ответа

Лучший ответ

Через awk

$ awk '/^ab[^a-z]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file

ИЛИ

$ awk '/^ab[^[:alpha:]]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file
32.58
58.2

Вышеупомянутая команда awk ищет строки, которые начинаются с ab, за которыми следует не буквенный (или буквенный) символ, один или несколько, за которыми следует строка cd в конце. Если он их находит, он удаляет строки ab и cd с помощью встроенной в awk функции gsub. Наконец, результат был перенаправлен на стандартный вывод.

Объяснение шаблона:

  • ^ Утверждает, что мы в начале очереди.
  • ab Соответствует строке ab
  • [^a-z]+ Один или несколько раз соответствует любому символу, отличному от a-z.
  • cd Соответствует строке cd
  • $ Конец строки.
0
Avinash Raj 27 Июл 2014 в 16:08
$ sed -n -r 's/^ab([^[:alpha:]]+)cd/\1/p' file
32.58
58.2

$ awk '/^ab([^[:alpha:]]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

Я подозреваю, что вы действительно хотите:

$ sed -n -r 's/ab([[:digit:].]+)cd/\1/p' file
32.58
58.2

$ awk '/ab([[:digit:].]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

То есть вместо удаления строк, содержащих буквы, по запросу, выберите строки, содержащие только цифры и точки между ab и cd.

1
Ed Morton 27 Июл 2014 в 13:24

Используйте grep:

grep -oE '[0-9]+[.][0-9]+' file

Другие формы:

grep -oE '[[:digit:]]+[.][[:digit:]]+' file
grep -o '[0-9]\+[.][0-9]\+' file

Еще один для awk:

awk '{ while (match($0, /[0-9]+[.][0-9]+/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file

Обновить

grep -oE '[0-9]+([.][0-9]+)?' file

awk '{ while (match($0, /[0-9]+([.][0-9]+)?/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file
0
konsolebox 27 Июл 2014 в 12:58

Это awk может сделать:

awk -F"ab|cd" '$2~/^[0-9.]+$/ {print $2}' file
32.58
58.2

Редактировать Выполнение awk выше не удастся, если у вас есть ab45.23ab и т. Д. Это gnu awk было бы лучше:

awk -F"cd" -v RS="ab" 'NF==2 && $1~/^[0-9.]+$/ {print $1}' file
32.58
58.2
0
Jotne 27 Июл 2014 в 16:26