Понимание команды sed :sed 's/\s\s */ /g'

Я сделал по методу ниже

sed -e "s/H//g" -e "s/\s.*//g" filename | perl -pne "s/\n/,/g"| sed "s/,$//g"

выход

1,337,1106,1129,1370
3
02.05.2020, 01:01
1 ответ

\s— это сокращенный способ регулярного выражения GNU для записи выражения POSIX [[:blank:]], который соответствует пробелу или символу табуляции(\sтакже соответствует новой строке, если они были вставлены в пространство шаблона sedс помощью других команды редактирования ). Нотация \sпервоначально пришла из регулярных выражений Perl, но в регулярном выражении Perl она работает так же, как [[:space:]]в выражении POSIX, сопоставляя более широкий массив пробелов -, производящих символы.

Команда

sed 's/\s\s*/ /g'

заменяет один или несколько последовательных пробелов/табуляций одним пробелом, а затем повторяет замену до тех пор, пока в текущей строке больше не будет совпадений.

Итак, да, вы могли бы использовать s/\s+/gвместо этого, но это расширенное(GNU )регулярное выражение, а не базовое, поэтому вам нужно было бы добавить -Eк команда:

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

Теперь используется не -стандартная опция(-E)и специальные GNU -регулярные выражения(\s). Чтобы написать команду стандартным образом, вам нужно будет использовать

sed 's/[[:blank:]][[:blank:]]*/ /g'

или

sed 's/[[:blank:]]\{1,\}/ /g'

где \{1,\}означает то же, что и расширенные модификаторы регулярных выражений +и{1,}(«один или несколько» ).

Вы также можете просто использовать

tr -s '[:blank:]' ' '

что сделало бы то же самое, т. е. преобразовало бы все пробелы и табуляции в пробелы и сжало бы(-s)ряды последовательных пробелов в одиночные пробелы.

Или вы можете заставить sedвыполнять работу tailв этом конвейере и использовать

ls -l dir | sed '1d; s/[[:blank:]]\{1,\}/ /g' | cut -d ' ' -f 3 | sort | uniq -c

Или просто используйтеawk:

ls -l dir | awk 'NR > 1 { count[$3]++ } END { for (user in count) print user, count[user] }'

awk,вам не нужно беспокоиться о сжатии пробелов)

10
28.04.2021, 23:16

Теги

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