sed를 사용하여 diff 출력에 특정 줄을 잘라내고 추가하기

sed를 사용하여 diff 출력에 특정 줄을 잘라내고 추가하기

두 디렉터리 사이의 diff 명령의 출력을 differenceOutput.txt.

현재 두 줄만 있으므로 differenceOutput.txt모든 줄은 A 또는 B 형식을 갖습니다. 여기서 A와 B는 다음과 같습니다.

ㅏ)

Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt

둘)

Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ

를 사용하여 A 형식의 모든 행을 C 형식으로 변경하고 B 형식의 모든 행을 D 형식으로 변경 sed하고 싶습니다 differenceOutput.txt. 여기서 C와 D는 다음과 같습니다.

씨)

/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing

디)

/tmp/__tmp_comp206_alex/diff_dir/file_3.conf differs 

어떻게 해야 합니까 sed? sed 구문이 매우 혼란스럽습니다. 나는 이것을 알아 내려고 몇 시간을 보냈지 만 알아낼 수는 없습니다. 누구든지 나를 도와줄 수 있나요?

답변1

여기요. 두 가지 간단한 sed대체

a='Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt'
b='Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ'

printf "%s\n%s\n" "$a" "$b" |
sed -e 's!^Only in \([^:]*\)/: \(.*\)!\1/\2 is missing!' -e 's!^Files .* and \(.*\) differ$!\1 differs!'

산출

/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing
/tmp/__tmp_comp206_alex/diff_dir/file_3.conf differs

설명하다

  • 레시피에서 구분 기호로 !not을 사용했습니다. 그렇지 않으면 모든 일치 항목을 이스케이프하고 문자열의 모든 항목을 바꿔야 합니다./seds/match/replacement//
  • \1일치 부분의 일치 항목 \2(예: ) 에서 및 이스케이프된 대괄호 표현식을 바꿉니다.\(...\)

가장 큰 가정은 파일 이름에 출력에 콜론 및 기타 일치하는 단어가 포함되어 있지 않다는 것입니다 diff. 출력은 기껏해야 부서지기 쉬우므로 자신의 루프를 굴려 원하는 출력을 직접 생성하는 diff것이 좋습니다 . (이것은 강력한 솔루션을 선호하는 것입니다.)findcmp -s

#!/bin/bash
src='/tmp/__tmp_comp206_alex/test_files'
dst='/tmp/__tmp_comp206_alex/diff_dir'

( cd "$src" && find -type f -print0 ) |
    while IFS= read -r -d '' item
    do
        if [[ ! -f "$dst/$item" ]]
        then
            printf "%s is missing\n" "$dst/$item"

        elif ! cmp -s "$src/$item" "$dst/$item"
        then
            printf "%s differs\n" "$dst/$item"
        fi
    done

답변2

$ awk '
    sub(/^Only in /,"") { sub(/: /,""); $0=$0 " is missing" }
    sub(/^Files /,"")   { sub(/ and .*/,""); $0=$0 " differs" }
1' differenceOutput.txt
/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing
/tmp/__tmp_comp206_alex/test_files/file_3.conf differs

디렉터리 이름에 :<blank>또는 가 포함되어 있지 않으며 <blank> and <blank>파일/디렉터리 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.

위 내용은 질문에 제공한 샘플 입력에서 생성된 파일을 사용하여 테스트되었습니다.

$ cat differenceOutput.txt
Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt
Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ

관련 정보