2014-02-25 2 views

ответ

5

Вы можете использовать sed (это не относится к GNU СЭД):

sed -r 's/[ ]{2,}//g' filename 

или (без -r):

sed 's/[ ]\{2,\}//g' filename 

Для вашего входа, это будет производить:

200 0 0100300400 10 
+1

Не нужно помещать пробел в список символов, так как в этом нет ничего особенного. Вероятно, вы должны указать, что он специфичен для GNU, поэтому плакат не тратит время на отладку, если он (он), скажем, Solaris. –

+1

Более основным регулярным выражением будет 's/* // g' - два пробела, за которыми следуют ноль или более пробелов, или с общим пробелом:' s/[[: space:]] [[: space:]] [[ : space:]] * // g' –

+0

@EdMorton (1) Это не спецификация GNU-sed, и она будет хорошо работать с другими вариантами sed. (2) Я понимаю, что пространство не является особенным, но я считаю его читаемым для квантификаторов при сопоставлении нескольких пространств. – devnull

4
sed 's/ \+//g' INPUTFILE 

будет работать (если вы GNU СЭД).

+1

Вы должны указать, что он специфичен для GNU. –

+0

Короче и отлично работает. :) Привет. –

5

Это будет работать с любой СЭД, а не только GNU СЭД:

sed -e 's/ *//g' 
0

Проводка здесь для справки, в awk решение:

$ echo '200 0 0 100  300 400 10' | awk '{gsub(/ +/,"")}1' 
200 0 0100300400 10 
+0

Поскольку awk использует EREs, gsub() может быть 'gsub (/ + /," ")'. –

+1

К сожалению, вы правы, и вы сохранили персонажа. Спасибо @EdMorton. Обновлен ответ.':)' –

+0

Возможно, это не проблема, но сценарий, опубликованный, также удалит пустые строки. '' {gsub (/ + /, "")} 1 '' будет более безопасным. Конечно, теперь мы снова потеряли сохраненные символы :-). –

0

Pure Bash. В скрипте можно использовать подстановку параметров:

str="200 0 0 100  300 400 10" 

shopt -s extglob 

str=${str// +()/} 
echo "$str" 

200 0 0100300400 10 

${str// +()/} Замещение удаляет все пробельные следуют по крайней мере один пробел.

Смежные вопросы