Вопрос Как совместить пробелы в sed?


Как я могу сопоставить пробелы в sed? В моих данных я хочу сопоставить все последующие пробелы + + (пробел) и заменить их на 2 пробела. Как это может быть сделано?


185
2018-02-24 11:53


происхождения




ответы:


Класс символов \s будет соответствовать символам пробела <tab> а также <space>,

Например:

$ sed -e "s/\s\{3,\}/  /g" inputFile

будет заменять каждую последовательность из по крайней мере 3 пробелов двумя пробелами.


Замечание: Для соответствия POSIX используйте класс символов [[:space:]] вместо \s, поскольку последний является расширением GNU sed. См. Спецификации POSIX для СЕПГ а также Бра


192
2018-02-24 12:08



Ага! Это был недостающий переключатель, который меня достал. - sequoia mcdowell
Мне также пришлось добавить переключатель -r ', который позволяет расширенному регулярному выражению, чтобы sed распознал' \ s 'как пространство. - HUB
С Apple sed Мне пришлось использовать [[:space:]] потому как \s не работал для меня. возможно \s это GNU sed расширение? - Jared Beck
@JaredBeck благодарит, у меня кончились идеи, почему мое простое регулярное выражение не работает. Это хромает, я думал, что \ s было стандартным расширенным регулярным выражением. Также -r не работает и -E приседал - Karthik T
Спасибо за ответ. Я обновил ответ со ссылками на стандарт POSIX. - mrucci


Это работает на MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



знаете ли вы, что это работает на всех дистрибутивах Linux? - amphibient
Как правило, GNU sed не будет иметь -E. На странице справки BSD: «Параметры -E, -a и -i являются нестандартными расширениями FreeBSD и могут быть недоступны в других операционных системах». - Brad Koch
Зачем нужен флаг -E для оператора +? Большинство выражений, вероятно, будет хорошо с * вместо этого, тогда это будет работать на других платформах. - Samuel
@Samuel Если вы используете *, регулярное выражение будет соответствовать нулю или больше пробелов, и вы получите пробел между каждым символом и пространство на каждом конце каждой строки. Если у вас нет флага -E, то вы хотите sed "s/[[:space:]]\+/ /g" для соответствия одному или нескольким пробелам. - jbo5112
FWIW, команда NetBSD поддерживает -E флаг. - mcandre


Некоторые старые версии sed не могут распознать \ s как маркер соответствия пробелу. В этом случае вы можете сопоставить последовательность из одного или нескольких пробелов и вкладок с помощью «[XZ] [XZ] *», где X - это пространство, а Z - вкладка.


13
2018-04-07 15:12



Таким образом, для конкретной потребности с более старым sed вы можете сделать: входной файл $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g, где X - вкладка, а Z - пробел. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



Гарантируется ли работа над любой версией sed на любой системе? Если нет, то стоит упомянуть, где это работает так же, как и другие ответы, просто мы знаем ограничения и где это может не иметь предполагаемого результата. - Mokubai♦
Этот RE - это то, что я использую для сопоставления пробелов. Это проще, чем классы символов только для соответствия вкладке или пробелу. Он использует только самые основные условные выражения регулярных выражений, поэтому он должен работать в любом месте с функциональной реализацией регулярных выражений. - Nate
На Mac 10.9.5 это соответствует пробелам и «t». Я использовал Майкла Думу выше, чтобы сопоставить символы пробелов (он также работает с -e). - Alien Life Form
Не работает разумно в моей системе SUSE. Он соответствует первому месту на линии, где есть ноль или больше пробелов, которое находится перед первым символом. Я сомневаюсь, что это назначенная функция, и, конечно же, это не был запрошенный вариант использования. Я считаю, что вы хотите изменить «*» на «\ +» (или «\ {3, \}» на вопрос) и, возможно, поместить g в конец команды sed, чтобы соответствовать всем вхождениям шаблона. Замена [\ t] на [[: space:]] также может быть желательной, если в строке есть что-то еще для пробелов. - jbo5112