>

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

1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211
3;1471383211;frank;WO12345;1471385211
4;1471385311;frank;WO12345;
5;1471385311;joe;WO12346;1471388211

bash 스크립트를 사용하여 frank 와 같은 지정된 이름을 포함하는 줄을 찾고 싶습니다. ) 및 지정된 WO 번호 (예 : WO12345 ) ) 또한 ; 로 끝납니다. 그런 다음 줄 끝에 문자열을 추가하십시오. stdout으로 출력하지 않고 파일을 직접 편집하고 싶습니다. read 사용법을 알고 있습니다  이름과 WO 번호를 얻으려면. 나는 sed 를 추측하고있다   -i 와 함께  올바른 도구입니다. 어떻게해야합니까?


  • 답변 # 1

    이름과 WO가 항상 연속적이라면 매우 간단합니다 :

    sed  '/frank;WO12345;/s/;$/;sometext/' -i file
    
    

    그들이 어딘가에 나타나거나 반드시 나란히 나타날 수 없다면, 명령 블록을 사용하여 두 테스트를 결합하십시오 :

    sed  '/;frank;/{/;WO12345;/s/;$/;sometext/}' -i file
    
    

  • 답변 # 2

    awk  필드로 구분 된 데이터에 더 적합합니다.

    awk 사용 :

    awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt
    
    
    ;Foobar 를 교체  마지막에 삽입하고 싶은 내용으로.

    여기서 ; 인지 확인 중입니다  분리 된 3 번째 및 4 번째 필드는 원하는 문자열과 일치합니다 (문자열 ;Foobar 인 경우)  끝에 추가됩니다.

    최신 GNU awk  (>= 4.10)에는 내부 편집 옵션이 있습니다 :

    awk -i inplace -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt
    
    

    만약 sponge 를 사용하지 않으면  GNU moreutils 에서  또는 temporaruy 파일 :

    awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt | sponge file.txt
    awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' \
           file.txt >file_temp.txt && mv file_temp.txt file.txt
    
    
    <시간>

    sed 를 고집한다면 :

    sed -Ei '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
    
    

    ([^;]*;){2}  처음 두 필드와 일치하고 세 번째와 네 번째 필드가 필요한지 확인한 다음 교체가 완료되었는지 확인했습니다

    <시간>

    예 :

    $ cat file.txt
    1;1471375551;joe;WO12344;
    2;1471378551;frank;WO12345;1471380211
    3;1471383211;frank;WO12345;1471385211
    4;1471385311;frank;WO12345;
    5;1471385311;joe;WO12346;1471388211
    $ awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt
    2;1471378551;frank;WO12345;1471380211;Foobar
    3;1471383211;frank;WO12345;1471385211;Foobar
    4;1471385311;frank;WO12345;;Foobar
    $ sed -E '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
    1;1471375551;joe;WO12344;
    2;1471378551;frank;WO12345;1471380211;Foobar
    3;1471383211;frank;WO12345;1471385211;Foobar
    4;1471385311;frank;WO12345;;Foobar
    5;1471385311;joe;WO12346;1471388211
    
    

관련 자료

  • 이전 Lynx는 파일 및 다운로드 링크에서 URL을 읽습니다
  • 다음 text processing - 리눅스에서 각 줄을 두 배로 늘리고 각 줄의 숫자를 다르게 변경하는 방법은 무엇입니까?