텍스트 파일로 가득 찬 디렉토리가 있습니다. 내 목표는 모든 항목의 시작과 끝에 텍스트를 추가하는 것입니다. 시작과 끝으로가는 텍스트는 각 파일마다 동일합니다.
웹에서 얻은 코드에 따르면 다음은 파일 시작 부분에 추가하는 코드입니다.
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를 사용할 수 있습니다.
이미 설명한 것처럼 일치 전후에 텍스트 줄을 삽입 할 수 있습니다. 각각 i
및 a
명령을 사용하여 sed
가있는 파일의 행입니다. “한 줄로 그리고 여러 파일 한 번에
다음은 첫 번째 1i
앞에 줄을 삽입합니다. 마지막 줄 $a
뒤에 있습니다. glob *.txt
와 일치하는 모든 파일에 대해 삽입이 실행됩니다.
sed -i -e "1ivar language = {" -e "$a};" -- *.txt
둘 다 i
및 a
는 줄 번호뿐만 아니라 주어진 패턴과 일치하는 모든 줄에서도 작동합니다. 줄에 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
댓글
답변
또한 다음과 같은 권한이 있습니다 (결과는 .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
)
댓글
- 참고 bufdo는 POSIX가 아닙니다. pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny가 맞습니다. 저는 스크립트 편집을 위해 개인적으로 POSIX 지정 기능 만 사용합니다.
답변
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
-i
대신이 파일 대체가 작동하지 않고 표준 출력으로 인쇄됩니다.