Передача подстановочного знака * в скрипт (bash?)

Передача подстановочного знака * в скрипт (bash?)

Я хочу удалить все цветовые коды, которые выглядят как «@n», «@R» и т. д., из довольно большой коллекции текстовых файлов.

Поэтому в файле под названием «remove_cc» я написал следующее:

sed -ie 's/@r//g' $1
sed -ie 's/@g//g' $1
sed -ie 's/@y//g' $1
sed -ie 's/@b//g' $1
sed -ie 's/@m//g' $1
sed -ie 's/@c//g' $1
sed -ie 's/@n//g' $1
sed -ie 's/@R//g' $1
sed -ie 's/@G//g' $1
sed -ie 's/@Y//g' $1
sed -ie 's/@B//g' $1
sed -ie 's/@M//g' $1
sed -ie 's/@C//g' $1
sed -ie 's/@N//g' $1
sed -ie 's/@W//g' $1
sed -ie 's/@K//g' $1

В любом случае, скрипт работает просто фантастически, если я использую его так: ./remove_cc file.txt

Но если я ввожу ./remove_cc *.txtпапку с множеством txt-файлов, для которых я хочу запустить скрипт, он ничего не делает. ./remove_cc *также неэффективен.

Есть ли способ исправить это, чтобы это работало?

решение1

Когда вы вводите ./remove_cc *, оболочка меняет его на ./remove_cc file1.txt file2.txt file3.txt etc, и запускает ваш скрипт таким образом. Ваш скрипт смотрит только на $1, первый параметр (file1.txt).

Самый общий способ сделать это — перебрать каждый параметр по очереди. "$@"расширяется до списка всех параметров, и мы можем использовать forего для перебора всех параметров.

for n in "$@" ; do
    sed -ie 's/@r//g' "$n"
    ...
done

В этом конкретном случае, поскольку sedпотребуется несколько имен файлов, можно упростить:

sed -ie 's/@r//g' "$@"

Обратите внимание, что при написании скриптов оболочки важно обращать внимание на кавычки. Например, без кавычек скрипт не будет работать с файлом с именем My Text File.txt.

решение2

просто используй

 for x in *
 do
     ./remove_cc $x
 done

Кстати, можно объединить все sed в одну строку

sed -i \
    -e 's/@r//g' -e 's/@g//g' -e 's/@y//g' -e 's/@b//g' \
    -e 's/@m//g' -e 's/@c//g' -e 's/@n//g' -e 's/@R//g' \
    -e 's/@G//g' -e 's/@Y//g' -e 's/@B//g' -e 's/@M//g' \
    -e 's/@C//g' -e 's/@N//g' -e 's/@W//g' -e 's/@K//g' \
    $1

Вы также можете объединять команды sed точками с запятой:

sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1

или просто используйте список символов

sed -i -e s/@[rgbcmyRGBCMY]//g $1

или

 sed -i -e s/@[rgbcmyRGBCMY]//g *

(обязательно проверьте, все ли буквы я вставил)

решение3

Используйте "$@"вместо $1. Или заключите подстановочный знак в кавычки:

$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2

решение4

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

ls *.txt | xargs -L1 ./remove_cc

xargs — это утилита, которая принимает stdin и преобразует его в параметры команды, которая должна быть запущена. У нее есть флаг -L, который ограничивает количество строк ввода, используемых за одно выполнение.

Связанный контент