텍스트 파일로 가득 찬 디렉토리가 있습니다. 나의 목표는 텍스트의 시작과 끝에 텍스트를 추가하는 것입니다. 시작과 끝 부분에있는 텍스트는 각 파일마다 동일합니다.
웹에서 얻은 코드를 기반으로 파일의 시작 부분에 추가하는 코드입니다.
echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt
파일 끝에 추가하는 코드입니다. 목표는 };
각 파일의 끝에 텍스트를 추가하는 것입니다 .
echo "};" >> $BASEDIR/Translations/Javascript/*.txt
내가 그린 예제는 개별 파일에 대한 작업이었습니다. 와일드 카드를 사용하여 여러 파일을 처리하려고한다고 생각했습니다 *.txt
.
다른 실수도 할 수 있습니다. 어쨌든 여러 파일의 시작과 끝에 텍스트를 어떻게 추가합니까?
답변
텍스트를 파일 앞에 추가하려면 (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
답변
GNU sed를 사용할 수 있습니다
이미 설명했듯이, 및 명령을 sed
사용하여 파일의 행과 일치하기 직전 및 직후에 텍스트 행을 삽입 할 수 있습니다 . 표시되지 않은 것은 한 줄로 여러 파일 을 한 번에 할 수 있다는 것입니다 .i
a
다음은 첫 줄 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
답변
다음을 사용하여 완전히 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
변경 사항을 저장하고 종료하는 것을 의미합니다.
답변
Perl에서 수행하는 방법은 다음과 같습니다.
for f in ./*txt; do
perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo &&
mv foo "$f";
done
답변
사용해보십시오 ex
:
ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo
명령은 다음과 같습니다.
bufdo!
열린 각 버퍼 / 파일에 대해 아래 명령을 실행합니다 (참고 : POSIX 아님)1s/^/HEAD/
–HEAD
줄의 시작 부분에서 첫 줄에 텍스트를 삽입 합니다$s/$/TAIL/
–TAIL
줄 끝의 마지막 줄에 텍스트를 추가 합니다
그리고 논쟁은 :
-s
-자동 / 빠른 모드-cxa
-열린 모든 버퍼 / 파일을 저장하고 종료*.foo
– 현재 디렉토리에있는 모든 파일 (*
과)foo
확장, 사용**/*.foo
recursivity에 대한 (globstar을 활성화 한 후 :shopt -s globstar
)
답변
으로 gnu awk
의 사용 inplace
확장 및 BEGINFILE
/ ENDFILE
:
gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
답변
또한 .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