%20.png)
Я хочу удалить все цветовые коды, которые выглядят как «@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, который ограничивает количество строк ввода, используемых за одно выполнение.