试图迭代存储在变量中的文件

时间:2018-03-29 18:18:50

标签: linux bash shell

我必须通过存储为变量的2个文件并删除包含存储在另一个变量中的字符串的行:

file1="./file1"
file2="./file2"
text="searched text"
for i in $file1,$file2; do
sed -i.txt '/$text/d' $i
done

与脚本位于同一文件夹中的文件。 我得到“没有这样的文件或目录”。我在过去的3个小时里一直被困在这里,说实话,我几乎要退出Linux了。

2 个答案:

答案 0 :(得分:1)

您的脚本中有几个问题。正确的方法是:

file1="./file1"
file2="./file2"
text="searched text"
for i in "$file1" "$file2"; do
  sed -i.txt "/$text/d" "$i"
done

的问题:

  • for期望以空格分隔的参数列表,而不是逗号分隔
  • 将变量扩展用双引号括起来以防止分词
  • 非常重要
  • 你需要双引号括起sed表达式,因为单引号不会扩展变量

您可以按照Charles的建议通过shellcheck和调试模式(bash -x script)来解决这些问题。

答案 1 :(得分:0)

很抱歉,您的shell脚本设计不合适。在shell脚本中,多个文件不应存储在多个变量中。假设你需要对100个不同的文件进行相同的操作,你会做什么?所以请遵循以下代码风格。将所有文件名放在一个文件中,例如filelist.dat,现在看: -

首先将所有文件名放在filelist.dat中并保存

text="searched text"
while read file; do
     sed -i.txt '/$text/d' $i
done < filelist.dat

还不确定sed命令是否会起作用。如果不工作,请按以下方式进行: -

 sed -i.txt 's|'"$text"'|d' $i