仅将"globbing“语法限制为后缀-globbing,仅限于*字符,假设我有:
// foo.txt
foo.*
biz
// bar.txt
bar
foo.bar我想写:
diff <(sort -u foo) <(sort -u bar)
# alternatively
comm -3 <(sort -u foo) <(sort -u bar)使它返回:
# diff
> bar
< biz
# comm
bar
biz这有可能在本地发生吗?
发布于 2020-07-17 15:10:29
如果要报告bar.txt中与foo.txt中的任何模式(在zsh中)不匹配的所有行,可以如下所示:
unique_lines=(${(fu)"$(或者一步一步:
print -rC1 -- ${${(fu)"$($(是类似ksh的操作符,它扩展到带有尾换行符的$file的内容。${(flags)param}使用参数展开标志来影响param展开。f标志,在linefeed上拆分(此处展开为非空行列表)。u (uniq):删除重复项。因此,${(fu)"$(扩展到foo.txt中唯一的非空行。${array:#pattern}扩展为与模式不匹配的$array元素。在这里,模式被构造为:${(j[|])unique_patterns},其中$unique_patterns的元素与|连接。所以我们最终得到了一个(line1|line2|...)模式。~ in $~pattern会在变量展开时将通配符视为通配符。注意,通配符语法是zsh通配符的语法。受几个shell选项的影响,比如extendedglob,kshglob,nocasematch.
在bash中,您可以使用以下方法执行类似的操作:
shopt -s extglob
pattern="@($(sort -u foo.txt | paste -sd '|' -))"
sort -u bar.txt |
while IFS= read -r line; do
[[ $line = $pattern ]] || printf '%s\n' "$line"
done这一次,语法是bash通配符的语法,类似于ksh88通配符。
请注意,bar.txt中行的顺序最终会被更改。
https://unix.stackexchange.com/questions/599020
复制相似问题