Используйте sed для возврата /abc/xyz, /abc и /xyz по данным /abc/xyz

С awkи его функцией system().

awk '{ system("echo rm "$2) }' list

Вышеупомянутое верно, если у вас не будет пробелов в имени вашего файла, если вместо этого вы попробуете ниже.

awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list

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

Снимите echo, чтобы выйти из -сухого хода.

3
10.11.2019, 16:52
1 ответ
$ sed -n -f script.sed file
/this/is/a/test
/this/is/a
/this/is
/this
/is/a/test
/is/a
/is
/a/test
/a
/test

Где script.sedэто

:outer
h
:inner
/./ {
    p
    s:/[^/]\{1,\}$::
    t inner
}
g
s:^/[^/]\{1,\}::
t outer

и где file— это файл, содержащий путь к примеру, который вы упомянули.

Этот сценарий реализует двойной цикл, обрабатывающий каждую строку ввода. Он ожидает получить строки с путями только .

Внешний цикл (с меткойouter)копирует текущую строку в область хранения(h). Внутренний цикл (с меткой inner), который полностью пропускается, если строка пуста, затем печатает текущую строку, если она не пуста. Затем последний /<anything>удаляется из текущей строки, и, если эта замена изменила данные, t innerвозвращается к началу внутреннего цикла.

В противном случае сохраненная строка извлекается из области удержания (g), а первая /<anything>удаляется из нее. Если эта замена изменила данные, код возвращается к началу внешнего цикла.

Конечным результатом является то, что вы печатаете свое полное имя пути, затем вы получаете каждое имя пути, которое генерируется путем отсечения последовательных компонентов пути с его конца.

Затем то же самое повторяется с путем, который вы получаете, удаляя первый элемент пути из исходного имени пути. И т. д.

Если поменять местами две замены в коде, получится то же самое, но в другом порядке:

/this/is/a/test
/is/a/test
/a/test
/test
/this/is/a
/is/a
/a
/this/is
/is
/this
3
27.01.2020, 21:21

Теги

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