내 스크립트에서 두 문자열의 차이를 확인하는 방법을 찾으려고합니다. diff 또는 comm으로 쉽게 할 수 있지만 파일을 다루지 않고 파일로 출력하지 않고 비교하고 다시 읽는 것을 선호합니다.
comm, diff, cmp 모두 두 파일 또는 파일과 표준 입력을 전달할 수 있습니다. 두 파일을 출력하지 않으려면 좋을 것 같지만 여전히 약간 짜증납니다.
grep 또는 정규식을 사용할 수 있다고 생각하고 있었지만 그렇지 않은 것 같습니다.
답변
사용 diff
하거나 com
또는 당신이 원하는대로 :
diff <(echo "$string1" ) <(echo "$string2")
Greg의 Bash FAQ : 프로세스 대체
또는 명명 된 파이프
mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p
Greg의 Bash FAQ : 명명 된 파이프 작업
명명 된 파이프는 FIFO라고도합니다.
-
그 자체는 표준 입력을위한 것입니다.
<<<
“여기 문자열”입니다.
&
비슷 ;
하지만 배경에 넣습니다
답변
이 질문을 상기시킵니다. Bash에서 두 파이프 라인을 어떻게 비교할 수 있습니까?
bash 세션에있는 경우 다음을 수행 할 수 있습니다.
diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)
와 <
bash에 의해 관리 – – 자신이 만든 임시 파일과 달리, 자동 파괴되도록 익명 명명 된 파이프를 생성.
따라서 명령 (grep, awk, sed, …)의 일부로 두 개의 다른 문자열을 분리 할 수 있다면 다음과 같이 할 수 있습니다.
diff < grep string1 myFile < grep string2 myFile
(파일 줄에 string1=very_complicated_value
및string2=another_long_and_complicated_value'
의 내부 형식을 모르고 : 정확한 명령을 권장 할 수 없습니다)
답변
나는 cmp
bash의 대체 기능을 선호 하고 처리합니다.
$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b 161 q
5 141 a 145 e
위치 2에서 ab는 첫 번째에 발생하지만 aq는 두 번째에 발생합니다. 위치 5에서 또 다른 차이가 발생합니다. 해당 문자열을 변수로 바꾸면 완료됩니다.
답변
세 줄이 있다고 가정 해 보겠습니다.
a="this is a line"
b="this is"
c="a line"
a에서 접두사 b를 제거하려면
echo ${a#"$b"} # a line
a에서 접미사 c를 제거하려면
echo ${a%"$c"} # this is
답변
다른 예시:
before="184613 102050 83756 63054"
after="184613 102050 84192 83756 63054"
comm -23 <(tr ' ' $'\n' <<< $after | sort) <(tr ' ' $'\n' <<< $before | sort)
출력
84192