У меня есть предложение:
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
может соответствовать одному или нескольким пробелам?
С помощью 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
sed 's/ \{2,\}/ /' # or
sed -E 's/ {2,}/ /'
Эта команда заменяет первое вхождение двух или более ({2,}
) пробелов одним пробелом, это соответствует первому большому пробелу в вашем примере. Если вы хотите заменить при каждом появлении двух или более пробелов, добавьте g
в конец команды:
sed 's/ \{2,\}/ /g' # or
sed -E 's/ {2,}/ /g'
Если вы хотите заменить только последовательность, например, три или более пробелов соответственно меняют цифру.
Внимательно прочитайте man sed
и man 7 regex
, и вы поймете:
sed -e 's/ \+/ /g'
заменит несколько соседних пробелов на один пробел во всей строке.