파일의 패턴 바로 앞에 명령 출력을 삽입하려면 어떻게 해야 합니까?

파일의 패턴 바로 앞에 명령 출력을 삽입하려면 어떻게 해야 합니까?

이 문제이에 대한 대답은 기존 파일("processedFile")의 내용이 다른 기존 파일("refacingFile") 중 하나 앞에 삽입될 수 있음을 보여줍니다.무늬s 내부에는 다음과 같이 됩니다:

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

때때로 이 콘텐츠의 출처는 다음과 같습니다.이전 명령 유닛, 아직 작성되지 않았습니다.

이때, processoredFile에 생성/쓰기를 하지 않고, command 단위의 결과를 receiveFile에 삽입하는 것이 가능한가요?

예:

예를 들어 다음과 같이 전처리합니다 someFile(라인 4부터 파일 끝까지 내용 읽기).

awk 'NR>3' someFile

이제 새 파일에 쓰는 대신 receiveFile에 직접 삽입하려고 합니다.무늬그래서:

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

awkPS: 또는 를 사용하는 것이 더 좋습니다 sed.


@RomanPerekhrest의 요청에 따라,

파일:

# 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

파일 받기:

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

답변1

모든 *NIX에서 이식 가능한지 여부는 구현에 따라 다릅니다. 내 Linux Debian에서 실행됩니다.

TL;DR: /dev/stdinsed에 대한 입력인 포함 파일로 사용되며 파이핑하기 전에 명령의 출력을 가져옵니다.

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

파일의 새 내용을 받습니다.

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

exPOSIX에 지정된 스크립트 가능한 형식 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

관련 정보