Удалить слова в строке, используя grep или sed - PullRequest
0 голосов
/ 02 июля 2019

Я хочу удалить три слова со специальным символом в строке, например

Введите:

\cf4 \cb6 1749,1789 \cb3 \

Выход:

1749,1789

Я пробовал пару операторов sed и grep, но пока что ни одно из них не сработало, в основном из-за персонажа \.

Моя неудачная попытка:

sed -i 's/ [.\c ] //g' inputfile.ext >output file.ext

Ответы [ 4 ]

5 голосов
/ 02 июля 2019

Awk принимает разделитель полей регулярных выражений (в данном случае, запятая или пробел):

$ awk -F'[ ,]' '$0 = $3 "." $4' <<< '\cf4 \cb6 1749,1789 \cb3 \'
1749.1789
  • -F'[ ,]' - использовать один символ из набора space/comma в качестве разделителя полей
  • $0 = $3 "." $4 - Если мы можем установить всю строку $0 в поле 3 $4, за которым следует буквальный период ".", за которым следует поле 4 $4, выполните поведение по умолчанию (вывести всю строку)

Заменить <<< 'input' на file, если каждая строка этого файла имеет одинаковые разделители (пробелы / запятые) и количество полей. Если ваш входной файл более сложный, чем образец, которым вы поделились, отредактируйте ваш вопрос, чтобы показать фактический ввод.

1 голос
/ 02 июля 2019

Обратная косая черта - это специальный метасимвол, который сбивает с толку bash.

Мы рассматриваем это как любой другой метасимвол, избегая его, с - как вы уже догадались - обратной косой чертой!

Но сначала нам нужно извлечь этот шаблон из нашего файла

grep '\\... \\... [0-9]+,[0-9]+ \\... \\' our_file # Close enough!

Теперь, просто выпейте эти надоедливые обратные слеши

| sed -e 's/\\//g' # Don't forget the g, otherwise it'll only strip out 1 backlash

Теперь, наконец, вычеркнули кластеры из 2 альфа, за которыми следуют число и пробел!

 | sed -e 's/[a-z][a-z][0-9] //g'

И, наконец, ....

grep '\\... \\... [0-9]+,[0-9]+ \\... \\' our_file | sed -e 's/\\//g' | sed -e 's/[a-z][a-z][0-9] //g'

Выход:

1749,1789

0 голосов
/ 03 июля 2019

Полагаю, у вас возникли проблемы, потому что у вас есть обратный слеш при вводе и вы не можете понять, как получить обратный слеш в своем регулярном выражении.Поскольку обратные слэши - это экранирующие символы для обработки и регулярного выражения, вам в итоге приходится вводить четыре обратных слэша, чтобы получить один в своем регулярном выражении.

Бен Ван Кэмп уже опубликовал ответ, в котором используются одинарные кавычки, чтобы немного ускользнуть;однако сейчас я опубликую ответ, который просто полностью устраняет проблему.

grep -o '[0-9]*,[0-9]*' | tr , .

Блокирует запятую, выбирает цифры с обеих сторон и выводит число.С другой стороны, если запятая не гарантируется, мы можем сделать это следующим образом:

egrep -o ' [0-9,]*|^[0-9,]*' | tr , . | tr -d ' '

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

0 голосов
/ 03 июля 2019
$ awk '{sub(/,/,".",$3); print $3}' file
1749.1789

$ sed 's/\([^ ]* \)\{2\}\([^ ]*\).*/\2/; s/,/./' file
1749.1789
...