전역 문자를 존중하는 Comm/Diff(또는 대안): 이것이 가능합니까?

전역 문자를 존중하는 Comm/Diff(또는 대안): 이것이 가능합니까?

"전역" 구문을 특히 후위 문자 글로빙으로 제한하려면 *다음과 같이 하십시오.

// 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

이게 현지에서 가능한가요?

답변1

bar.txt패턴과 일치하지 않는 의 모든 행을 보고하려면 다음과 같이 할 수 있습니다.foo.txtzsh

unique_lines=(${(fu)"$(<bar.txt)"})
unique_patterns=(${(fu)"$(<foo.txt)"})
pattern="(${(j[|])unique_patterns})"

print -rC1 -- ${unique_lines:#$~pattern}

아니면 한 번에 모든 작업을 수행하세요.

print -rC1 -- ${${(fu)"$(<bar.txt)"}:#(${(j[|])~${(fu)"$(<foo.txt)"}})}
  • $(<file)$file후행 개행 문자 다음에 줄무늬 콘텐츠 로 확장되는 ksh와 유사한 연산자입니다 .
  • ${(flags)param}사용매개변수 확장 플래그확장 에 영향을 미칩니다 param.
  • f줄 바꿈으로 구분된 플래그(여기서는 비어 있지 않은 줄 목록으로 확장됨)
  • u(uniq): 중복된 항목을 제거합니다. 따라서 ${(fu)"$(<foo.txt)"}비어 있지 않은 고유한 줄로 확장됩니다.foo.txt
  • ${array:#pattern}$array패턴과 일치하지 않는 요소로 확장됩니다. 여기의 스키마는 다음과 같이 구성됩니다.
  • ${(j[|])unique_patterns}요소는 $unique_patterns에 연결됩니다 |. 그래서 우리는 패턴으로 끝납니다 (line1|line2|...).
  • in을 사용하면 변수가 확장될 때 와일드카드 문자가 와일드카드 문자로 처리됩니다 ~.$~pattern

와일드카드 구문은 zsh와일드카드 구문입니다. 이는 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

이번에는 ksh88의 구문과 유사한 bash extglob 와일드카드 구문을 사용합니다.

행의 순서는 bar.txt결국 변경됩니다.

관련 정보