[^\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:]]*//'