неожиданный результат, обрезав последний столбец с помощью sed - PullRequest
3 голосов
/ 17 июня 2019
echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'

результат:

60 тест

последний столбец не вырезан. но это работает довольно хорошо с

echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'

результат:

60

почему

Ответы [ 2 ]

6 голосов
/ 17 июня 2019

[^\s]+ означает not backslash or s repeated 1 or more times, а test содержит s, а home - нет, поэтому последний соответствует регулярному выражению, а первый - нет.

Вы должны были использовать любой извместо этого они совпадают с не пробелами:

$ echo '60 test' | sed -r 's/(.*)\s+\S+$/\1/'
60

$ echo '60 test' | sed -r 's/(.*)\s+[^[:space:]]+$/\1/'
60

Как подсказывает @potong в комментарии, для удаления последнего столбца с помощью sed все, что вам действительно нужно:

sed -E 's/\s+\S+$//'

Я переключился с-r до -E, поскольку -r только для GNU sed, а -E для GNU или OSX / BSD sed, поэтому обычно лучше использовать НО OSX / BSD sed, который не распознает \s или \Sпоэтому изменение с -r на -E на самом деле не делает скрипт более переносимым в этом случае, вам придется использовать это вместо:

sed -E 's/[[:space:]]+[^[:space:]]+//'

, а затем быть полностью переносимым на все POSIXseds это будет:

sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'

или это будет вести себя одинаково, если всегда есть 2 или более полей:

sed 's/[[:space:]]*[^[:space:]]*//'
1 голос
/ 17 июня 2019

Если вы просто печатаете первую часть вашей строки перед пробелом, не делая никаких других изменений, вы можете просто использовать cut

echo '60 test' | cut -d' ' -f1
60

где вы определяете разделитель (-d) и поле (-f), которое хотите выбрать. Не нужно переходить к сложному решению, использующему sed и выполняющему некоторые операции по замене.

С помощью awk вы также можете напечатать первое поле:

echo '60 test' | awk '{print $1}'
60

или через grep в режиме Perl для учета \s

echo '60 test' | grep -oP '^.*?(?=\s)'
60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...