두 디렉터리 사이의 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을 사용했습니다. 그렇지 않으면 모든 일치 항목을 이스케이프하고 문자열의 모든 항목을 바꿔야 합니다./
sed
s/match/replacement/
/
\1
일치 부분의 일치 항목\2
(예: ) 에서 및 이스케이프된 대괄호 표현식을 바꿉니다.\(...\)
가장 큰 가정은 파일 이름에 출력에 콜론 및 기타 일치하는 단어가 포함되어 있지 않다는 것입니다 diff
. 출력은 기껏해야 부서지기 쉬우므로 자신의 루프를 굴려 원하는 출력을 직접 생성하는 diff
것이 좋습니다 . (이것은 강력한 솔루션을 선호하는 것입니다.)find
cmp -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