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

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

웹에서 얻은 코드에 따르면 다음은 파일 시작 부분에 추가하는 코드입니다.

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

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

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

내가 가져온 예제 개별 파일에 대한 작업이었습니다. 와일드 카드 *.txt를 사용하여 여러 파일에 대해 작업을 시도 할 것이라고 생각했습니다.

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

Answer

사용할 수있는 파일 앞에 텍스트를 추가하려면 ( sed)의 GNU 구현 :

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 

답변

GNU sed를 사용할 수 있습니다.

이미 설명한 것처럼 일치 전후에 텍스트 줄을 삽입 할 수 있습니다. 각각 ia 명령을 사용하여 sed가있는 파일의 행입니다. “한 줄로 그리고 여러 파일 한 번에

다음은 첫 번째 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 

답변

이 포함될 때마다 주석이 삽입됩니다.

ex 를 사용하는 완전한 POSIX 호환 명령 :

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는 변경 사항을 저장하고 종료하는 것을 의미합니다. .

답변

다음은 Perl에서 수행하는 방법입니다.

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

댓글

  • @St é phaneChazelas 추가 -i 대신이 파일 대체가 작동하지 않고 표준 출력으로 인쇄됩니다.
  • @OlehPrypin, 실제로 귀하의 권리입니다. 댓글이 삭제되었습니다.

답변

또한 다음과 같은 권한이 있습니다 (결과는 .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 

답변

ex 사용 시도 :

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

여기서 명령은 다음과 같습니다.

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

및 인수는 다음과 같습니다.

  • -s-무음 / 빠른 모드
  • -cxa– 열려있는 모든 버퍼 / 파일을 저장하고 종료
  • *.foo-현재 디렉토리 (*)의 모든 파일을 foo 확장, 재귀를 위해 **/*.foo 사용 (globstar 활성화 후 : shopt -s globstar)

댓글

답변

gnu awk에서 inplace 확장 및 BEGINFILE / ENDFILE :

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

답변

Perl 한 줄짜리 구조 :

perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다