Удаление нескольких пробелов с помощью sed

У меня есть предложение:

171211 22043707      21641 xxxx     xxxxxxx  From (,,xxxx,xxxx) Vxxxx1:  xxxxxx
171212 13441585        417 xxxx     xxxxxxxx Server manager informed of process termination, pinfo =  x,0000032585 13:44:15

Проблема в том, что расстояние между 171211 22043707 и 21641 варьируется. Я хочу заменить его одним пробелом. Как мне это сделать? Какая команда sed может соответствовать одному или нескольким пробелам?

0
задан 13 December 2017 в 14:31

3 ответа

С помощью tr вы можете сделать это намного проще:

tr -s ' '

из tr man:

 -s, --squeeze-repeats
          replace each input sequence of a repeated character that is
          listed in SET1 with a single occurrence of that character
2
ответ дан 13 December 2017 в 14:31
sed 's/ \{2,\}/ /' # or
sed -E 's/ {2,}/ /'

Эта команда заменяет первое вхождение двух или более ({2,}) пробелов одним пробелом, это соответствует первому большому пробелу в вашем примере. Если вы хотите заменить при каждом появлении двух или более пробелов, добавьте g в конец команды:

sed 's/ \{2,\}/ /g' # or
sed -E 's/ {2,}/ /g'

Если вы хотите заменить только последовательность, например, три или более пробелов соответственно меняют цифру.

1
ответ дан 13 December 2017 в 14:31

Внимательно прочитайте man sed и man 7 regex, и вы поймете:

sed -e 's/ \+/ /g'

заменит несколько соседних пробелов на один пробел во всей строке.

0
ответ дан 13 December 2017 в 14:31

Другие вопросы по тегам:

Похожие вопросы: