sed

sed

다음과 같은 파일이 있습니다.

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 -ised

$ 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

관련 정보