Как удалить определенный символ в строке, но только если в Linux нет чисел в этой строке

8

Я был озадачен этой, казалось бы, простой для решения проблемы ... ну, на некоторое время.

Вот пример вывода из файла, который мне нужно отредактировать:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Мне нужно убрать пробелы между «Джорджем Вашингтоном» и «Женевской конвенцией», но не пробелы между «123 281 029 долларов США» или «342 019 929 евро».

По сути, моя цель здесь состоит в том, чтобы удалить пробел между словами ТОЛЬКО в строке, если в этой строке нет чисел.

Я пытался редактировать файл с помощью grep -v [0-9] $file | sed 's/ //', но единственный способ, который будет работать, - это если я выведу в другой файл, но это будет означать исключение всех строк с номерами из старого файла в новый файл, а это не то, что мне нужно ...

Я пробовал несколько довольно смешных циклов с grep, sedно, похоже, ничего не получилось.

Опять же, вот пример выходного файла:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Вот мой желаемый результат:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR
user62129
источник

Ответы:

15

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

sed '/[0-9]/!s/ //g' filename

Это позволит удалить пробелы во всех строках, которые не содержат цифры.

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

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

Для удаления пробела только между первыми двумя словами (здесь используется GNU sedдля -r, используйте -Eвместо этого на BSD):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename
devnull
источник
Отлично! Это именно то, что я искал! Не удалось найти синтаксис для части "/ [0-9] /! S /". Большое спасибо.
user62129
@ user62129 - если этот ответ решит вашу проблему, пожалуйста, найдите минутку и отметьте галочкой под подсчетом голосов слева, это будет означать, что ваша проблема была решена.
SLM
7

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

perl -ple 's/\s+//g unless /\d/' file
cuonglm
источник
4

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

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

Это будет, например, обратиться George and Harry 12 EURк GerogeandHArry 12 EURи по- прежнему работать правильно за исключением случаев , в вашем примере.

Тердон
источник