【发布时间】:2016-04-21 19:13:02
【问题描述】:
我有一个名为 input 的文件,其中包含维基百科列表或维基百科标题的子字符串。我只想打印出维基百科标题的行,而不是子字符串。
我有另一个名为 wikititle 的文件,其中包含所有 wikipedia 标题的列表。所以我想从输入中提取每一行,如果它与 ^{string}$ 匹配,我想打印出该行。
我想出了以下命令:
cat input | xargs -0 -I{} bash -c 'grep -q -w ^{}$ wikititle && { echo {}; }'
但它给了我一个错误:
xargs: command too long
我该如何做到这一点?谢谢!
【问题讨论】:
-
顺便说一句——“命令太长”的最可能原因是使用
-0而您的输入 实际上 没有以 NUL 分隔。如果您的输入实际上是换行符分隔的并且您使用了xargs -0,那么它将尝试创建一个命令,同时将文件中的每个文件名都替换到其中(包括换行符分隔符)。 -
您是否尝试过将
-l1(小写L,然后是1)传递给xargs?如果你的输入是一个常规的文本文件,你不想使用-0,这通常意味着从find -print0提供。 -
...另外,顺便说一句,为什么
grep -q ... && echo?离开-q离开grep不会有同样的效果吗?如果您想确保不超过一个匹配项,-m 1会这样做。 -
另外,
^${foo}$并不能完全保证与${foo}匹配。想想如果foo包含方括号、问号或任何其他有趣的正则表达式字符会发生什么。 -
@jamieguinan,我认为遇到 NUL 分隔流的地方比单独的
find -print0多得多;以/proc/*/environ为例。当需要将参数列表序列化到文件(或同样用于数组)时,我也是printf '%s\0' "$@"的习惯用户。但是,是的,同意 OP 在这里可能没有 NUL 分隔的流。 :)