Я начинаю с bash, и у меня была эта строка выражения. Я теряюсь в понимании того, что это значит.

Что означает эта строка в выражении регулярного выражения оболочки?

find . -name '*.sh' | sed 's#.*/##' | sed 's#\.sh##'
0
Aya 27 Апр 2021 в 16:31
1
Если в вашей системе есть реализация GNU Coreutils basename, вы можете вместо этого использовать find . -name '*.sh' -exec basename {} .sh \;.
 – 
steeldriver
27 Апр 2021 в 17:29
1
Или, по крайней мере, используйте один sed, например. sed -e 's#.*/##' -e 's#\.sh##'
 – 
Archemar
27 Апр 2021 в 18:03
1
После комментария @steeldriver — также: find . -name '*.sh' | xargs basename -s '.sh' — должно работать с базовым именем GNU и BSD.
 – 
glenn jackman
27 Апр 2021 в 19:01

1 ответ

Лучший ответ

Оператор find ищет в текущем каталоге и его подкаталогах все файлы, оканчивающиеся на .sh, и печатает их по одному файлу в строке.

Оператор s sed заменяет совпадающие подстроки чем-то другим. Синтаксис: s<delimiter>regex<delimiter>replacement<delimiter>. Обычно в качестве разделителя используется /, но здесь используется #.

замена в обоих операторах sed — это пустая строка.

Поэтому первый оператор отсекает все до последнего / в имени файла (т. е. в подкаталоге). Второй оператор отсекает суффикс .sh имени файла.

Файл a/subdir/hierarchy/my_script.sh будет напечатан как my_script.

1
Christo 27 Апр 2021 в 16:49