roo*_*roo 4 shell-script quoting wildcards
我想从中等大小的文本文件集合中删除所有看起来像“@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
Run Code Online (Sandbox Code Playgroud)
无论如何,如果我使用它,该脚本的效果非常好:./remove_cc file.txt
但是,如果我输入./remove_cc *.txt
一个包含许多要在其上运行脚本的 txt 文件的文件夹,则它无法执行任何操作。 ./remove_cc *
同样无效。
有没有办法解决这个问题,使其有效?
只是使用
for x in *
do
./remove_cc $x
done
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以将所有 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
Run Code Online (Sandbox Code Playgroud)
您还可以使用分号加入 sed 命令:
sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1
Run Code Online (Sandbox Code Playgroud)
或者只使用字符列表
sed -i -e s/@[rgbcmyRGBCMY]//g $1
Run Code Online (Sandbox Code Playgroud)
或者
sed -i -e s/@[rgbcmyRGBCMY]//g *
Run Code Online (Sandbox Code Playgroud)
(一定要检查我已经放了所有的信)
当您键入 时./remove_cc *
,shell 会将其更改为./remove_cc file1.txt file2.txt file3.txt etc
,并以这种方式运行您的脚本。您的脚本只查看$1
第一个参数 (file1.txt)。
最通用的方法是依次循环每个参数。 "$@"
扩展到所有参数的列表,我们可以使用for
它们来循环。
for n in "$@" ; do
sed -ie 's/@r//g' "$n"
...
done
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,由于sed
将采用多个文件名,您可以简化:
sed -ie 's/@r//g' "$@"
Run Code Online (Sandbox Code Playgroud)
请注意,在编写 shell 脚本时注意引号很重要。例如,如果没有引号,脚本将无法处理名为My Text File.txt
.