Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是否将特定行复制并附加到具有特定名称格式的文件?_Linux_Bash_Shell - Fatal编程技术网

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
将错误地显示为没有匹配项。如果匹配的文件名中有不规则的空格,这也将不正确。我发布了一个单独的答案,它以一种稍微不同的方式解决了这个问题,而这些角落的案例没有问题。是的,你是对的。让我删除代码并留下解释,我希望这是有用的。