답변:
글쎄, vim
그 자체를 사용하여 :
vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...
이것이하는 일 :
setline (n, text)
, 라인 n
을로 설정하는 함수입니다 text
.call
함수를 호출하는 데 필요합니다.bufdo
버퍼 전체에서 명령을 반복하는 데 사용됩니다 (범위없이 모든 버퍼에서 작동).wq
버퍼를 저장하고 종료합니다. 다음 버퍼로 넘어 가기 전에이 작업을 수행해야하므로이 명령은을 call
사용하여 명령에 연결됩니다 |
.-c cmd
runs cmd
는 첫 번째 버퍼를로드 한 후 명령 모드 명령입니다.Nes
호환되지 않는 자동 모드로 설정되어 비 대화식 처리에 더 좋습니다.혜택:
setline
- 텍스트의 내용이 무엇이든 될 수 있습니다 &
A의 sed
대체 텍스트는 의도하지 않은 영향을 미칠 수 있습니다.sed
사용하기가 훨씬 쉬워 보이지만 vim
똑같이 할 수있는 것이 정말 좋습니다 ! 답변 주셔서 감사합니다!
bufdo
). 파일이 이미 열려 있고 ... 및를 다른 것으로 표시하는 것을 고려하십시오 1s/foo/bar/
.
다른 옵션들 :
awk
(상대적으로 새로운 버전의 GNU가 필요함 awk
)
$ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
펄 / 쉘
$ for f in *txt; do
perl -i -lne '$.==1 ? print "new line" : print' "$f"
done
쉘 / 코어 유틸리티
$ for f in *txt; do
( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f";
done
이 스크립트는 실제로 원본을 변경하지 않고 변경된 파일을 새 디렉토리에 배치하여 요청한대로 수행합니다.
d=/tmp/cooked
mkdir $d
for f in * #will match all files in current directory; adjust as desired
do
echo "This is the new 1st line" > /${d}/${f}
sed 1d ${f} >> /${d}/${f}
done
tail 및 cat 명령은 다음과 같이 쉽게 수행 할 수 있습니다.
tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file
그것들을 적절한 루프에 싸서 하드 코딩 된 임시 파일 이름 대신 적절하고 올바른 임시 파일을 사용하십시오. bash와 다른 쉘에는 임시 파일을 작성하는 구문이 있다고 생각합니다.
tail의 -n 옵션에는 인수에 더하기 부호가 있는지 여부에 따라 두 가지 해석이 있습니다. 더하기 부호가 있으면 주어진 행 번호 에서 시작 하여 파일의 꼬리를 표시한다는 의미 입니다. 그렇지 않으면 숫자는 마지막 줄을 포함하여 해당 꼬리가 출력되는 줄 수입니다.
sed
실제로 내가 찾던 것입니다!