复制特定行并将其附加到具有特定名称格式的文件中?

时间:2018-07-20 06:02:02

标签: linux bash shell

我正在将某些特定行从一个文件复制到另一个文件。

   grep '^stringmatch' /path/sfile-*.cfg  >> /path/nfile-*.cfg

发生了什么:它创建了一个名为nfile-*.cfg的新文件,并在其中复制了这些行。文件名sfile- *nfile- *是随机生成的,通常后跟一个数字。 sfile-*nfile-*都是现有文件,并且在同一目录中只有一个这样的文件。仅随后的数字是随机生成的。 sfilenfile之后的数字不必相同。这些文件不是同时创建的,而是在给出特定命令时生成的。但是,从一个文件到另一文件的某些行需要附加。

2 个答案:

答案 0 :(得分:1)

我猜你实际上想要类似的东西

for f in /path/sfile-*.cfg; do
    grep '^stringmatch' "$f" >"/path/nfile-${f#/path/sfile-}"
done

这将循环所有sfile个匹配项,并创建一个nfile目标文件,其破折号后的数字与相应的源sfile相同。 (参数替换${variable#prefix}返回variable的值,并删除了模式prefix上的任何前导匹配。)

如果只有一个匹配文件,则循环将只运行一次。如果通配符上没有匹配项,则除非启用nullglob,否则循环仍将运行一次,这会更改外壳程序的globlob行为,从而使不匹配的通配符扩展为空,而不是通配符表达式本身。如果您不想启用nullglob,通常的解决方法是在grep;

之前的循环中添加它。
    test -e "$f" || break

如果您希望循环仅在有多个匹配项时才处理第一个匹配项,请在break之前在一行上单独添加done

答案 1 :(得分:0)

如果我正确地解释了您的问题,您想输出到现有的nfile,其中有一个随机数,但是Shell正在创建一个带有星号的文件,因此实际上是{{1 }}。

之所以发生这种情况,是因为第一次运行命令时nfile-*.cfg不存在。如果文件不存在,nfile将无法展开bash,而是将nfile-*.cfg用作文字字符。这是*中的正确行为。

因此,看来问题是启动bashnfile不存在。您需要创建一个。

我将代码留给其他人,但我希望解释是有用的。

相关问题