首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通信/差异(或替代)尊重全球字符:这是可能的吗?

通信/差异(或替代)尊重全球字符:这是可能的吗?
EN

Unix & Linux用户
提问于 2020-07-17 14:21:30
回答 1查看 130关注 0票数 3

仅将"globbing“语法限制为后缀-globbing,仅限于*字符,假设我有:

代码语言:javascript
复制
// foo.txt
foo.*
biz

// bar.txt
bar
foo.bar

我想写:

代码语言:javascript
复制
diff <(sort -u foo) <(sort -u bar)

# alternatively
comm -3 <(sort -u foo) <(sort -u bar)

使它返回:

代码语言:javascript
复制
# diff
> bar
< biz

# comm
bar 
biz

这有可能在本地发生吗?

EN

回答 1

Unix & Linux用户

发布于 2020-07-17 15:10:29

如果要报告bar.txt中与foo.txt中的任何模式(在zsh中)不匹配的所有行,可以如下所示:

代码语言:javascript
复制
unique_lines=(${(fu)"$(

或者一步一步:

代码语言:javascript
复制
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中,您可以使用以下方法执行类似的操作:

代码语言:javascript
复制
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中行的顺序最终会被更改。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/599020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档