SH CLI sed удаляет все символы кроме пути из списка - PullRequest
2 голосов
/ 07 апреля 2019

Есть файл с результатами списка rsync файлов:

drwxrwxrwx          4,096 2018/12/10 15:27:39 test/dir/one
drwxrwxrwx          4,096 2018/12/10 15:27:39 best/folder/two

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

требуемый результат:

test/dir/one
best/folder/two

Я попробовал это регулярное выражение : это работает как следует для нахождения предшествующих путей в качестве основы для sed, но не имеет никакого эффекта при использовании:

cat listing.txt | sed 's/.*[0-9]+:[0-9]+:[0-9]+ //' | less

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Ваш sed, вероятно, не поддерживает оператор повторения + в этой форме. Попробуйте

sed 's/.*[0-9]\+:[0-9]\+:[0-9]\+ //' listing.txt

(что также избавляет от этой надоедливой бесполезной cat).

Напомним, что sed предшествует многим изыскам современного регулярного выражения. Ваш sed может поддерживать флаг -r или -E для включения расширенной поддержки регулярных выражений (хотя это все еще далеко от современного диалекта регулярных выражений, с которым многие новички наиболее знакомы), но это не переносимо.

Конечно, если в листинге используется фиксированная ширина поля, возможно просто попробуйте

cut -c47- listing.txt

(Не там, где я могу проверить точное число - поиграйте с разными значениями.)

0 голосов
/ 08 апреля 2019

Это будет работать с любым POSIX sed, даже если ваши имена файлов содержат пробелы:

$ sed 's/\([^ ]* *\)\{4\}//' file
test/dir/one
best/folder/two

или любой POSIX awk:

$ awk '{sub(/([^ ]* *){4}/,"")}1' file
test/dir/one
best/folder/two

Если имена ваших файлов могут содержать символы новой строки, тогда мы должны поговорить ....

...