이 문제이에 대한 대답은 기존 파일("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>
awk
PS: 또는 를 사용하는 것이 더 좋습니다 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/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
파일의 새 내용을 받습니다.
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