>

이 질문 과 그 답변은 기존 파일의 내용 ("processedFile ")이패턴중 하나 전에 다른 기존 파일 ("receivingFile ")에 삽입 될 수 있음을 보여줍니다. 내부와 같이 :

sed -i -e '/pattern/r processedFile' receivingFile

때때로 이러한 콘텐츠는이전 명령 단위에서 비롯된 것일 수 있으며 아직 작성되지 않았습니다

이 시점에서, 처리 된 파일을 작성/기록하지 않고 명령 유닛의 결과를 수신 파일에 삽입 할 수 있습니까?

예 :

우리는 someFile 를 전처리했습니다.  다음과 같이 (4 번째 줄부터 파일 끝까지 내용 읽기) :

awk 'NR>3' someFile

이제 이것을 새로운 파일에 쓰지 않고,패턴전에 다음과 같이 수신 파일에 직접 삽입하려고합니다 :

awk 'NR>3' someFile | <insertion commands>

PS : 바람직하게는 awk 를 사용하여  또는 sed .

<시간>

@RomanPerekhrest의 요청에 따라

someFile:

# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505

전처리 :

awk 'NR>3' someFile  :

0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505

receivingFile:

stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.

  • 답변 # 1

    구현 방법에 따라 휴대가 * NIX와 호환되는지 여부를 알 수 없습니다. Linux 데비안에서 작동합니다.

    TL;DR : /dev/stdin 사용  포함 된 파일로, sed의 입력이며 파이프 앞에 명령의 출력을 가져옵니다.

    awk 'NR>3' someFile | sed -i -e '/pattern/r /dev/stdin' receivingFile
    
    

    예 : receivingFile 라는 대상 파일 내용 :

    stackExchange is the best.
    pattern
    Unix stackExchange is the best of the bests.
    
    

    someFile 라는 입력 샘플 :

    # random output
    # random
    11
    0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
    0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
    
    

    패턴 뒤에 삽입하려면 :

    awk 'NR>3' someFile | sed -e '/pattern/r /dev/stdin' receivingFile
    
    

    패턴 앞에 삽입하려면 OP와 덤프로 연결된 응답을 다시 사용하여 출력 :

    awk 'NR>3' someFile | sed -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
    
    

    요청한 작업을 수행하고 파일을 바꾸려면 :

    awk 'NR>3' someFile | sed -i -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
    
    

    receingFile의 새로운 내용 :

    stackExchange is the best.
    0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
    0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
    pattern
    Unix stackExchange is the best of the bests.
    
    

    업데이트: @don_crissti가 언급했듯이패턴이 마지막 줄이면 작동하지 않습니다. 다음은 동일한 링크 된 질문에 대한 그의 대답에서 조정 된 다른 명령입니다! 여분의 빈 줄을 임시로 추가 (및 sed로 억제)하려면 다른 명령이 필요합니다. 이 두 가지가 작동합니다 :

    awk 'NR>3' someFile | sed -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile <(printf '\n') > receivingFile.new
    mv receivingFile.new receivingFile
    
    

    또는 그냥 (bash가 필요없고 sed -i 를 떠남  최종 파일을 처리하려면) :

    awk 'NR>3' someFile | { echo '' >> receivingFile; sed -i -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile ; }
    
    

    라인 분할 sed 코드에 대한 링크 된 답변을보십시오.

  • 답변 # 2

    ex 만 사용하십시오. POSIX 지정 스크립트 가능한 vi 형식  (또한 POSIX 지정)

    printf '%s\n' '/pattern/-r !awk "NR>3" somefile' x | ex receivingFile
    
    

    또는보다 일반적으로 :

    printf '%s\n' '/pattern/-r !somecommand' x | ex somefile
    
    

  • 답변 # 3

    sed 포함 (GNU sed) 4.4

    sed -i '/pattern/{h;s/.*/awk "NR>3" somefile/e;p;x}' receivingFile
    
    

관련 자료

  • 이전 ubuntu - sed를 사용하여 라인의 일부를 표시하는 다른 방법이 있습니까
  • 다음 디렉토리 브랜치 내에서 특정 파일의 총 크기 찾기