我正在将某些特定行从一个文件复制到另一个文件。
grep '^stringmatch' /path/sfile-*.cfg >> /path/nfile-*.cfg
发生了什么:它创建了一个名为nfile-*.cfg
的新文件,并在其中复制了这些行。文件名sfile- *
和nfile- *
是随机生成的,通常后跟一个数字。 sfile-*
和nfile-*
都是现有文件,并且在同一目录中只有一个这样的文件。仅随后的数字是随机生成的。 sfile
和nfile
之后的数字不必相同。这些文件不是同时创建的,而是在给出特定命令时生成的。但是,从一个文件到另一文件的某些行需要附加。
答案 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
用作文字字符。这是*
中的正确行为。
因此,看来问题是启动bash
时nfile
不存在。您需要创建一个。
我将代码留给其他人,但我希望解释是有用的。