2017-01-09 2 views
0

как я могу заменить вкладку или пустые места одной точкой с запятой?замените пробелы или вкладки точкой с запятой с помощью sed

Это то, что я пытаюсь:

sed -i.bak 's/(\s)+|(\t)+/,/g' aws_lab.txt 
+/ was unexpected at this time. 

Благодаря

+0

Вам нужно '-r' использовать расширенное регулярное выражение. – aragaer

+0

Try 's/[] + /;/g' где и - это одиночные символы, которые они представляют – Marichyasana

+1

@aragaer' -r' является только GNU sed, '-E' также поддерживается GNU sed, но дополнительно работает в OSX sed, поэтому он более портативен, чем '-r'. –

ответ

2

Просто используйте соответствующий класс POSIX символов:

sed 's/[[:space:]]\{1,\}/,/g' aws_lab.txt 

Очень немногие SEDS признают \s стенографии для [[:space:]] и поскольку вкладка является одним из символов, включенных в [:space:], вам не нужно указывать ее отдельно. Кроме того, + является метасимволом ERE, а не BRE, поддерживаемым sed по умолчанию, поэтому вам нужно добавить аргумент -E arg для использования его (поддерживается только с помощью вариантов GNU и OSX sed).

+1

Хорошие точки, thx, исправлены. Да, я знаю о '[: blank:]', но почти всегда бывает, что либо строка, в которой вы работаете, не содержит символы новой строки, и поэтому используете ли вы: '[: blank:]' или '[: space:]' не имеет значения, или ваша строка DOES включает в себя символы новой строки, а затем вы хотите, чтобы они обрабатывались как все остальные пробелы, поэтому вы хотите '[: space:]' вместо '[: blank:]'. Поэтому я обычно использую '[: space:]' для представления любого пробела и просто использую '[: blank:]', если у меня есть конкретная причина, чтобы исключить новые строки. –

0

Это может работать для вас (GNU СЭД):

sed -i.bak 's/[ \t][ \t]*/:/' file 

Или

sed -ri.bak 's/[ \t]+/:/' file 

Там, где есть явное пространство Infront вкладки:

sed -i.bak 's/[ \t][ \t]*/:/g' file 

Заменит повторен шаблонов по всей линии.

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