"전역" 구문을 특히 후위 문자 글로빙으로 제한하려면 *
다음과 같이 하십시오.
// 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.txt
zsh
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
결국 변경됩니다.