Удалить несколько пробелов - Unix Script - PullRequest
0 голосов
/ 12 февраля 2019

Из моего сценария оболочки я пытаюсь удалить повторяющиеся пробелы, но кажется,

tr -s " " < input.txt > output.txt 

не работает.Есть ли другой способ удалить несколько последовательных пробелов в один пробел из сценария оболочки.

Я пытаюсь удалить пробелы из содержимого

1     | First         | PO BOX 123        | DAYTON          | OH            | 3432-222
2     | Second        | PO BOX 2223       | CALIFORNIA      | CA            | 23423 
3     | THIRD         | PO BOX 21         | COLUMBUS        | OH            | 2223

в этот

1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423
3|THIRD|PO BOX 21|COLUMBUS|OH|2223

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

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

sed 's/ *| */|/g' input.txt 

Вывод:

1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423 
3|THIRD|PO BOX 21|COLUMBUS|OH|2223

Примечание: это функционально тот же код, что и PaulProgrammer ответ, но упрощенный из-за того, что input.txt является пробелом "" символов (без табуляции, и др. ).

0 голосов
/ 13 февраля 2019

Мне нравится использовать awk для вещей, у которых есть записи.tr tr аннотирует текст, sed - это s tream ed итор, но awk понимает концепцию записей, полей, разделителей полей,и т. д.

Итак, чтобы завершить ваш набор параметров, вот решение в минимальном awk:

$ awk -F ' *\\| *' '{$1=$1} 1' OFS='|' input.txt
1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423
3|THIRD|PO BOX 21|COLUMBUS|OH|2223

Это устанавливает разделитель поля ввода с -F и разделитель поля вывода с OFS.Сценарий состоит из оператора, который приводит к перезаписи записи с помощью OFS, и оператора (ярлык 1) для печати строки.

Обратите внимание на странное экранирование вертикальной черты в -F вариант.Если вы хотите использовать это, чтобы избежать путаницы, вы можете вместо этого awk -F ' *[|] *' ....

Чтобы быть еще короче за счет ясности, вы также можете использовать:

$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt

Это превращает оператор перезаписи записи в условие, которое всегда должно возвращать true, тем самым устраняя необходимость в ярлыке 1.Хотя он сбрасывает несколько символов из сценария, я включаю его только для развлечения;гораздо лучше использовать код, который не заставляет вас чесать голову, когда вы перечитываете его через год или два.;)

0 голосов
/ 12 февраля 2019

Попробуйте использовать sed вместо tr:

sed 's/[[:blank:]]\{1,\}|[[:blank:]]\{1,\}/|/g' < input > output

или вместо Perl:

perl -ne 's#\s+\|\s+#|#g; print;' input > output
...