Bash에서 여러 텍스트 파일의 시작과 끝에 텍스트를 어떻게 추가합니까?


24

텍스트 파일로 가득 찬 디렉토리가 있습니다. 나의 목표는 텍스트의 시작과 끝에 텍스트를 추가하는 것입니다. 시작과 끝 부분에있는 텍스트는 각 파일마다 동일합니다.

웹에서 얻은 코드를 기반으로 파일의 시작 부분에 추가하는 코드입니다.

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

파일 끝에 추가하는 코드입니다. 목표는 };각 파일의 끝에 텍스트를 추가하는 것입니다 .

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

내가 그린 예제는 개별 파일에 대한 작업이었습니다. 와일드 카드를 사용하여 여러 파일을 처리하려고한다고 생각했습니다 *.txt.

다른 실수도 할 수 있습니다. 어쨌든 여러 파일의 시작과 끝에 텍스트를 어떻게 추가합니까?

답변:


27

텍스트를 파일 앞에 추가하려면 (GNU 구현에서 sed) 다음을 사용할 수 있습니다 .

sed -i '1i some string' file

텍스트를 추가하는 것은 간단합니다

echo 'Some other string' >> file

마지막으로 할 일은 편집하려는 모든 파일을 반복하는 루프에 넣는 것입니다.

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

8

GNU sed를 사용할 수 있습니다

이미 설명했듯이, 및 명령을 sed사용하여 파일의 행과 일치하기 직전 및 직후에 텍스트 행을 삽입 할 수 있습니다 . 표시되지 않은 것은 한 줄로 여러 파일 을 한 번에 할 수 있다는 것입니다 .ia

다음은 첫 줄 1i과 마지막 줄 뒤에 줄을 삽입합니다 $a. glob와 일치하는 모든 파일에 대해 삽입이 실행됩니다 *.txt.

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

모두 ia뿐만 아니라 행 번호와 작업뿐만 아니라, 주어진 패턴과 일치하는 모든 라인을한다. 행에 var y = 2;다음 이 포함될 때마다 주석이 삽입됩니다 .

sed -i -- '/var y = 2;/i//initialize variable y' *.js

5

다음을 사용하여 완전히 POSIX 호환 명령 ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

printf명령 의 일부만 실행하면 명령이 전달되는 정확한 편집 명령이 표시됩니다 ex.

0a
var language = {
.
$a
};
.
x

0a"0 행 다음에 텍스트 추가"를 의미합니다 (즉, 첫 번째 행 앞). 다음 행은 0 행 다음에 "추가"할 리터럴 텍스트 .입니다. 행 자체 의 마침표 ( )는 추가 될 텍스트를 종료합니다.

$a 파일의 마지막 줄 다음에 텍스트를 추가하는 것을 의미합니다.

x 변경 사항을 저장하고 종료하는 것을 의미합니다.


2

Perl에서 수행하는 방법은 다음과 같습니다.

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

-i이 파일 대체 대신 @ StéphaneChazelas 추가 가 작동 하지 않고 stdout으로 인쇄됩니다.
Oleh Prypin

@OlehPrypin, 당신의 권리입니다. 댓글이 삭제되었습니다.
Stéphane Chazelas

1

사용해보십시오 ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

명령은 다음과 같습니다.

  • bufdo!열린 각 버퍼 / 파일에 대해 아래 명령을 실행합니다 (참고 : POSIX 아님)
  • 1s/^/HEAD/- HEAD줄의 시작 부분에서 첫 줄에 텍스트를 삽입 합니다
  • $s/$/TAIL/- TAIL줄 끝의 마지막 줄에 텍스트를 추가 합니다

그리고 논쟁은 :

  • -s -자동 / 빠른 모드
  • -cxa -열린 모든 버퍼 / 파일을 저장하고 종료
  • *.foo- 현재 디렉토리에있는 모든 파일 ( *과) foo확장, 사용 **/*.foorecursivity에 대한 (globstar을 활성화 한 후 : shopt -s globstar)


1
@StevenPenny가 맞습니다. 스크립트 편집 에는 POSIX 지정 기능 만 개인적으로 사용합니다 .
와일드 카드

1

으로 gnu awk의 사용 inplace확장 및 BEGINFILE/ ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

또한 .out파일에 대한 결과와 함께 다음과 같은 권리가 있습니다 .

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

더 정교해진 또 다른 변형-소스 파일이 결과로 대체되었습니다.

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

0

구조에 펄 한 라이너 :

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.