code

Bash의 문자열 차이

codestyles 2020. 8. 23. 09:14
반응형

Bash의 문자열 차이


내 스크립트에서 두 문자열의 차이를 확인하는 방법을 찾으려고합니다. 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및 a string2=another_long_and_complicated_value': 이 있다고 가정하면 정확한 명령을 권장 할 수 없습니다)


나는 cmpbash의 대체 기능을 선호 하고 처리합니다.

$ 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

여기에 원래 답변

참고 URL : https://stackoverflow.com/questions/454427/string-difference-in-bash

반응형