단일 명령으로 여러 텍스트 파일을 편집하는 방법은 무엇입니까?


18

여러 텍스트 파일의 첫 번째 줄을 제거하고 다른 줄로 바꾸고 싶습니다. 터미널을 사용하여 이것을 수행하는 방법이 있습니까?

vim 사용법을 알고 있습니다. vim을 자동화하는 방법이 있습니까? 각 파일을 개별적으로 편집하는 것처럼 수동으로 수행하지 않으려 고합니다.

가능하면 새 라이브러리 설치를 피하고 싶습니다 (특히 매우 간단하다고 생각하지만 잘못 될 수 있습니다).

미리 감사드립니다!

답변:


21

당신은 사용할 수 있습니다 sed:

sed -i.bak '1s/^.*$/new line/' *.txt

이렇게하면 .txt현재 디렉토리에있는 모든 파일 의 첫 줄이 text new line로 바뀌고 필요에 따라 변경됩니다.

또한 원본 파일은 다음을 .bak사용하지 않으려는 경우 확장명 으로 백업됩니다 .

sed -i '1s/^.*$/new line/' *.txt

감사합니다! sed실제로 내가 찾던 것입니다!
TomTsagk

@TomTsagk Glad 내가 도울 수 :)
heemayl

11

글쎄, vim그 자체를 사용하여 :

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

이것이하는 일 :

  • setline (n, text), 라인 n을로 설정하는 함수입니다 text.
  • call 함수를 호출하는 데 필요합니다.
  • bufdo 버퍼 전체에서 명령을 반복하는 데 사용됩니다 (범위없이 모든 버퍼에서 작동).
  • wq버퍼를 저장하고 종료합니다. 다음 버퍼로 넘어 가기 전에이 작업을 수행해야하므로이 명령은을 call사용하여 명령에 연결됩니다 |.
  • -c cmdruns cmd는 첫 번째 버퍼를로드 한 후 명령 모드 명령입니다.
  • Nes 호환되지 않는 자동 모드로 설정되어 비 대화식 처리에 더 좋습니다.

혜택:

  • setline- 텍스트의 내용이 무엇이든 될 수 있습니다 &A의 sed대체 텍스트는 의도하지 않은 영향을 미칠 수 있습니다.

sed사용하기가 훨씬 쉬워 보이지만 vim똑같이 할 수있는 것이 정말 좋습니다 ! 답변 주셔서 감사합니다!
TomTsagk

@TomTsagk 글쎄, 나는 여러 파일에서 어떻게 행동 할 수 있는지 설명하고 싶었다 ( bufdo). 파일이 이미 열려 있고 ... 및를 다른 것으로 표시하는 것을 고려하십시오 1s/foo/bar/.
muru

대박 !!! <3_ <3
Campa

3

다른 옵션들 :

  • 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
    

2

이 스크립트는 실제로 원본을 변경하지 않고 변경된 파일을 새 디렉토리에 배치하여 요청한대로 수행합니다.

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

나는 느리게 대답했다 (내 코드를 테스트했다) ... 그리고 나는 heemayl의 솔루션을 훨씬 좋아한다!
찰스 볼링

0

사용 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

0

jEdit : 대량 찾기 및 바꾸기에 사용합니다. RegEx-정규 표현식을 사용하는 기능이 강력합니다. 디렉토리 내의 파일을 조작하고 파일 확장자 (예 : ".html"등)를 지정할 수 있습니다. 또한 GUI에서 컨텍스트에서 후보 변경의 로캘을 확인할 수 있습니다. jEdit은 훌륭합니다.

jEdit는 Ubuntu의 소프트웨어 센터를 통해 제공됩니다.


0

tail 및 cat 명령은 다음과 같이 쉽게 수행 할 수 있습니다.

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

그것들을 적절한 루프에 싸서 하드 코딩 된 임시 파일 이름 대신 적절하고 올바른 임시 파일을 사용하십시오. bash와 다른 쉘에는 임시 파일을 작성하는 구문이 있다고 생각합니다.

tail의 -n 옵션에는 인수에 더하기 부호가 있는지 여부에 따라 두 가지 해석이 있습니다. 더하기 부호가 있으면 주어진 행 번호 에서 시작 하여 파일의 꼬리를 표시한다는 의미 입니다. 그렇지 않으면 숫자는 마지막 줄을 포함하여 해당 꼬리가 출력되는 줄 수입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.