我正在尝试编写一个bash脚本,用户可以在其中传递正则表达式作为参数。例如,你以这种方式运行程序。
./clean_txt.sh s/.*\(my_choices.*gz\)/\1p
在程序中,我以这种方式使用该参数。
ls /home/user/ | sed -n '$1' > cleaned_file.txt
echo "sed -n '$1'"
在我的回声中,我看到在启动程序时传递的正则表达式。但是我的cleaning_file.txt是空的。这种方法的唯一方法是,如果我将正则表达式硬编码到程序本身,但这会破坏我想要做的目的。
关于如何将该参数传递给sed命令的任何想法?
答案 0 :(得分:2)
问题是你的变量没有被扩展。你需要用双引号括起来(这是你在echo
已经做过的事情):
ls /home/user/ | sed -n "$1" > cleaned_file.txt
请注意,不需要ls
:
files=( /home/user/* )
sed -n "$1" <<<"${files[@]}" > cleaned_file.txt
会做同样的事情。这使用glob来创建一个包含所有文件名的数组,该数组用作sed的输入。