여러 텍스트 파일의 첫 번째 줄을 제거하고 다른 줄로 바꾸고 싶습니다. 터미널을 사용하여 이것을 수행하는 방법이 있습니까?
vim 사용법을 알고 있습니다. vim을 자동화하는 방법이 있습니까? 각 파일을 개별적으로 편집하는 것처럼 수동으로 수행하지 않으려 고합니다.
가능하면 새 라이브러리 설치를 피하고 싶습니다 (특히 매우 간단하다고 생각하지만 잘못 될 수 있습니다).
미리 감사드립니다!
답변
당신은 사용할 수 있습니다 sed
:
sed -i.bak '1s/^.*$/new line/' *.txt
이렇게하면 .txt
현재 디렉토리에있는 모든 파일 의 첫 줄이 text new line
로 바뀌고 필요에 따라 변경됩니다.
또한 원본 파일은 다음을 .bak
사용하지 않으려는 경우 확장명 으로 백업됩니다 .
sed -i '1s/^.*$/new line/' *.txt
답변
글쎄, 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
runscmd
는 첫 번째 버퍼를로드 한 후 명령 모드 명령입니다.Nes
호환되지 않는 자동 모드로 설정되어 비 대화식 처리에 더 좋습니다.
혜택:
setline
– 텍스트의 내용이 무엇이든 될 수 있습니다&
A의sed
대체 텍스트는 의도하지 않은 영향을 미칠 수 있습니다.
답변
다른 옵션들 :
-
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
답변
사용 gawk
gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt
예
% cat foo.txt
1
2
3
4
% cat bar.txt
1
2
3
4
% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt
% cat foo.txt
your_replacement
2
3
4
% cat bar.txt
your_replacement
2
3
4
답변
jEdit : 대량 찾기 및 바꾸기에 사용합니다. RegEx-정규 표현식을 사용하는 기능이 강력합니다. 디렉토리 내의 파일을 조작하고 파일 확장자 (예 : “.html”등)를 지정할 수 있습니다. 또한 GUI에서 컨텍스트에서 후보 변경의 로캘을 확인할 수 있습니다. jEdit은 훌륭합니다.
jEdit는 Ubuntu의 소프트웨어 센터를 통해 제공됩니다.
답변
tail 및 cat 명령은 다음과 같이 쉽게 수행 할 수 있습니다.
tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file
그것들을 적절한 루프에 싸서 하드 코딩 된 임시 파일 이름 대신 적절하고 올바른 임시 파일을 사용하십시오. bash와 다른 쉘에는 임시 파일을 작성하는 구문이 있다고 생각합니다.
tail의 -n 옵션에는 인수에 더하기 부호가 있는지 여부에 따라 두 가지 해석이 있습니다. 더하기 부호가 있으면 주어진 행 번호 에서 시작 하여 파일의 꼬리를 표시한다는 의미 입니다. 그렇지 않으면 숫자는 마지막 줄을 포함하여 해당 꼬리가 출력되는 줄 수입니다.