Найти ";" затем удалите пробелы до следующего символа - PullRequest
1 голос
/ 09 апреля 2019

У меня много строк, начинающихся с «;», затем 1 или более пробелов, за которыми следуют другие символы в той же строке. Мне нужно удалить пробелы после ";" до, но не включая символы, которые следуют.

Я попробовал несколько вариантов следующего кода, потому что он отлично работал на строках с пустыми пробелами, но я не очень знаком с awk.

awk '{gsub(/^ +|  +$/,"")}1'  filea>fileb

Пример ввода:

;    4
;  group 452
;          ring

Требуется вывод:

;4
;group 452
;ring

Ответы [ 4 ]

2 голосов
/ 09 апреля 2019
awk '{sub(/^; +/,";")}1' file

;4
;group 452
;ring
2 голосов
/ 09 апреля 2019

Чтобы удалить пробел после первой точки с запятой, попробуйте:

$ awk '{sub(/^;[[:blank:]]+/, ";")} 1' filea
;4
;group 452
;ring

Регулярное выражение ^;[[:blank:]]+ соответствует первой точке с запятой и любым пробелам или символам табуляции, которые следуют за ней. Функция sub заменяет это на ;. Так как это происходит только один раз в строке (в начале), нет необходимости в gsub.

[:blank:] - это безопасный для юникода способ указания пробела.

1 голос
/ 09 апреля 2019

sed также будет делать:

sed -E 's/^(;){1}([[:blank:]]+)/\1/' file

Скобки используются в качестве селекторов, а комбинация \number представляет соответствующий выбор.

В ^(;){1}([[:blank:]]+) мы проверяем наличиеначало строки (^) и ;, которые встречаются один раз ({1}), за которыми следует любое количество пустых символов ([[:blank:]]+), а затем замените сопоставленный шаблон нашим первым выбором.

0 голосов
/ 09 апреля 2019

Определяет разделитель полей FS как начало записи, за которым следует ; и набор пробелов.Затем он переопределяет разделитель выходного поля OFS как просто ;.Преобразование из FS в OFS выполняется путем переназначения $1 на себя.

awk 'BEGIN{FS="^; *";OFS=";"}{$1=$1}1'

или

awk -F'^; *' -vOFS=";" '{$1=$1}1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...