Linux 是否将特定行复制并附加到具有特定名称格式的文件?
我正在将一些特定的行从一个文件复制到另一个文件Linux 是否将特定行复制并附加到具有特定名称格式的文件?,linux,bash,shell,Linux,Bash,Shell,我正在将一些特定的行从一个文件复制到另一个文件 grep '^stringmatch' /path/sfile-*.cfg >> /path/nfile-*.cfg 这里发生了什么:它创建了一个名为nfile-*.cfg的新文件,并在其中复制这些行。文件名sfile-*和nfile-*是随机生成的,后面通常跟一个数字。sfile-*和nfile-*都是现有文件,同一目录中只有一个这样的文件。只有后面的数字是随机生成的。sfile和nfile中的数字不必相同。这些文件不是同时
grep '^stringmatch' /path/sfile-*.cfg >> /path/nfile-*.cfg
这里发生了什么:它创建了一个名为
nfile-*.cfg
的新文件,并在其中复制这些行。文件名sfile-*
和nfile-*
是随机生成的,后面通常跟一个数字。sfile-*
和nfile-*
都是现有文件,同一目录中只有一个这样的文件。只有后面的数字是随机生成的。sfile
和nfile
中的数字不必相同。这些文件不是同时创建的,而是在发出特定命令时生成的。但是从一个文件到另一个文件的一些行需要追加 如果我正确解释了您的问题,您希望输出到一个现有的nfile
,其中包含一个随机数,但是shell正在创建一个带有星号的文件,因此字面上是nfile-*.cfg
这是因为第一次运行命令时,nfile
不存在。如果文件不存在,bash
将无法展开nfile-*.cfg
,而是将*
用作文字字符。这是bash
中的正确行为
因此,问题似乎是启动grep
时,nfile
不存在。您需要创建一个
我将把代码留给其他人,但我希望解释是有用的。我猜您实际上想要这样的东西
for f in /path/sfile-*.cfg; do
grep '^stringmatch' "$f" >"/path/nfile-${f#/path/sfile-}"
done
这将循环所有sfile
匹配项,并创建一个nfile
目标文件,在破折号后使用与相应源sfile
相同的编号。(参数替换${variable#prefix}
返回variable
的值,并删除模式prefix
上的任何前导匹配项。)
如果只有一个匹配文件,循环将只运行一次。如果通配符上没有匹配项,则循环仍将运行一次,除非启用nullglob
,这会更改shell的全局行为,使没有匹配项的通配符扩展为零,而不是扩展为通配符表达式本身。如果您不想启用nullglob
,一个常见的解决方法是将其添加到循环中,grep
之前
test -e "$f" || break
如果希望循环仅处理第一个匹配(如果有多个匹配),请在
完成之前的一行上添加break
,并且nfile-*.cfg
是否包含sfile
中的正确行?是,新生成的nfile-*.cfg
具有来自sfile
的正确行。在重定向中使用globbing不是有点危险吗?如果您只有一个以nfile-
开头的文件,那么它将以预期的方式工作,但在其他情况下会产生令人惊讶的结果。我无法复制这个,您使用的是哪个版本的bash shell?正如@user1934428所提到的,如果您有并且只有一个匹配的文件,那么它应该可以工作。当我尝试使用多个匹配的文件时,bash会出现不明确的重定向
错误。如果不存在匹配的文件,我只能创建名称中带有*
的文件。对不起,我不知道这是问题所在。@triplee如果没有反勾,则不会展开*
。。。尝试运行foo=*;用双引号回显“$foo”
,您将得到*
,而不是目录列表。不是我最喜欢的bash
功能,但我相信它是有意义的!我可以把那张向上的票拿回来吗?错误是你用引号,这显然抑制了通配符的扩展。(一般来说,常见的错误是人们没有在应该引用的地方引用变量,因此从这个意义上说,这是一种改进…)在这种情况下,我实际上希望扩展发生在NFILE=
行中。如果它发生在测试中,-e
如果已经有多个nfile
,则会失败并出现错误。我的编码的真正问题是,它会将一个现有文件与其中一个失败的glob*
匹配:-),也就是说,如果编码设置正确,请随意编辑并用(*)
替换反勾号。我通常在bash
中避免使用数组,但在这种情况下看起来很不错。如果通配符扩展到多个文件,请在[!-e
将错误地显示为没有匹配项。如果匹配的文件名中有不规则的空格,这也将不正确。我发布了一个单独的答案,它以一种稍微不同的方式解决了这个问题,而这些角落的案例没有问题。是的,你是对的。让我删除代码并留下解释,我希望这是有用的。