다음과 같은 파일이 있습니다.
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
즉, 타임스탬프가 있는 줄을 유지하고 다른 줄, 즉 줄의 시작부터 쉼표까지 171023 03014426 1234 XXXX XXXXXXXX
유지 하고 변경 사항을 동일한 파일에 써야 합니다.error code: 123
산출:
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
어떻게 해야 합니까?
답변1
귀하의 질문을 이해한 바에 따르면 귀하는 이것을 원합니다
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
이렇게 되려면:
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
이를 수행하는 방법은 다양하므로 원하는/좋아하는/선호하는 방법을 선택하십시오.
sed
$ sed 's/\(error code:[[:blank:]][[:digit:]]*\),.*/\1/' input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
원본 파일을 변경하려면 다음 대신 input.txt
사용하십시오 .sed -i
sed
앗
$ awk -F ',' '/^error code/{$0=$1};1' input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
이 접근 방식을 사용하면 쉼표가 열(즉, "필드"에서) 구분 기호로 처리되므로 여기서는 기본적으로 error code
텍스트로 시작하는 줄을 찾고 원래 줄을 열로만 바꿉니다 $1
. 즉, 쉼표 앞의 모든 항목이 됩니다. error code: 123
.
awk
텍스트 내 편집(대부분의 버전)을 할 수는 없지만 sed -i
항상 새 파일로 출력하고 다음과 같이 이전 파일을 새 파일로 바꿀 수 있습니다.
awk -F ',' '/^error code/{$0=$1};1' input.txt > new_data.txt && mv new_data.txt input.txt
순수한 배쉬
#!/usr/bin/env bash
# make temp file for writing stuff
temp=$(mktemp)
# read input file, make necessary changes, write to temp file
while IFS= read -r line;
do
case $line in
"error code:"*) printf "%s\n" "${line%%,*}" >> "$temp";;
*) printf "%s\n" "$line" >> "$temp";;
esac
done < "$1"
mv "$temp" "$1"
테스트 실행:
$ # before
$ cat input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
$ # after
$ ./edit_error_codes.sh input.txt
$ cat input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
답변2
만지고 싶지 않은 줄에 쉼표가 없고 항상 첫 번째 쉼표와 그 뒤의 모든 내용만 삭제하려는 경우 매우 간단한 표현식을 사용할 수 있습니다.
$ sed 's/,.*//' file
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
s/old/new/
old
로 교체하다new
.*
임의의 문자 수
파일을 제자리에서 편집하려면 sed
의 내부 옵션인 을 사용하십시오 -i
. 백업 파일의 접미사가 뒤에 추가되면 -i
해당 확장자를 가진 원본 파일의 백업이 동일한 디렉터리에 자동으로 기록됩니다. 예를 들어
sed -i 's/,.*//' file
file
수정된 스트림으로 덮어쓰지만
sed -i.orig 's/,.*//' file
수정된 스트림을 쓰고 원래 내용으로 file
새 파일을 씁니다 .file.orig
답변3
간단한 cut
명령을 사용하여 원하는 작업을 수행할 수 있습니다.
cut -d"," -f1 input.txt
동일한 파일에 다시 작성하십시오.
cut -d"," -f1 input.txt | tee input.txt