Bash: Как исключить все числовые символы в строке, но сохранить их в квадратных скобках? - PullRequest
0 голосов
/ 13 сентября 2018

Как удалить все числа в строке в bash, но сохранить эти числа в скобках с помощью awk?

Пример данных, которые хранятся в файле .txt:

(A678) John, 35 Apples and 9 Oranges
(E312) Mark, 12 Oranges
(B21) Brooke, 40 Bananas

Выход:

(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas

Ответы [ 5 ]

0 голосов
/ 13 сентября 2018

Исходя из предоставленного вами примера ввода / вывода, вы, кажется, спрашиваете, как реализовать одно возможное решение вашей проблемы, а не спрашивать о своей проблеме, то есть это выглядит как XY вопрос . Это может быть все, что вам действительно нужно:

$ awk '{t=$1; gsub(/[0-9]/,""); $1=t} 1' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
0 голосов
/ 13 сентября 2018

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

awk -v RS='[ \n]' '!/^[0-9]+$/{printf "%s%s",$0,RT}' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas

Если запись (устанавливается с помощью RS) не является числом !/^[0-9]+$/, awk печатает ее.

Как выделено в комментариипо @kvantour, это работает, только если числа в скобках не пробелы.Если это так, вы можете использовать следующее:

awk -v RS="[()\n]" 'RT!=")"{gsub(/[0-9]+ ?/,"")}!/^[0-9]+$/{printf "%s%s",$0,RT}' file

Это решение, однако, не будет работать с вложенными или неправильно выровненными скобками.

0 голосов
/ 13 сентября 2018

Не могли бы вы попробовать следующее.

awk '{for(i=1;i<=NF;i++){if($i!~/\(|\)/ && $i~/[0-9]/){sub(/[0-9]+/,"",$i)}}} 1' Input_file
0 голосов
/ 13 сентября 2018

Это может сработать для вас (GNU sed);

sed 's/\(\([^(0-9]*\(([^)]*)\)[^(0-9]*\)*\)[0-9]\+ */\1/g' file

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

0 голосов
/ 13 сентября 2018

Это может быть проще, используя sed:

sed -E 's/(^| )[0-9]+( |$)/ /g' file

(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...