텍스트 파일에서 "start"라는 단어 뒤에 변수를 추가하고 싶습니다.
echo $variable
주어진
rn=45
fg=12
cd=6
내 텍스트 파일은 다음과 같습니다
mixture
Molefraction
begin
END_OF_FILE
내가 원하는 출력
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
sed
이 명령을 사용하고 있습니다
sed -i "/begin/a $variable" file.txt
이것은 다음과 같은 오류 메시지를 제공합니다
sed: -e expression #1, char 56: extra characters after command
답변1
sed
"여기 문자열"을 이해하는 쉘을 사용하십시오 .
$ sed '/begin/r/dev/stdin' file <<<"$variable"
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
이것은 string 을 찾고 일치하면 표준 입력에 있는 모든 내용이 삽입됩니다 begin
. 여기서는 문자열을 통해 표준 입력 값을 전달합니다 file
.$variable
다른 쉘의 경우 여기에 있는 문자열을 printf
파이프로 간단히 대체할 수 있습니다.
$ printf '%s\n' "$variable" | sed '/begin/r/dev/stdin' file
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
새 파일에 저장하려면 마지막에 리디렉션을 사용하세요. sed
이를 사용하여 내부 편집을 지원 하는 경우 sed -i
이를 사용하여 원본 파일을 수정할 수 있습니다(파일 복사본에서 테스트하는 것이 좋습니다. 여러 번 실행하면 파일에 여러 번 데이터가 추가됩니다).
올바른 들여쓰기를 얻으려면 다음과 같이 하십시오 bash
.
$ ( set -f; IFS=$'\n'; printf ' %s\n' $variable ) | sed '/begin/r/dev/stdin' file
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
여기서는 쉘의 토큰화를 사용하여 변수 값의 형식을 지정합니다. 우리는 set -f
이를 사용하여 파일 이름 글로빙이 발생하지 않도록 한 다음 $IFS
개행 문자를 설정하고 쉘이 변수 값을 개행으로 구분된 단어로 분할하도록 합니다. 약간 수정 printf
하고 각 단어 앞에 공백 두 개를 삽입하세요.
답변2
사용 awk
:
awk -v f="$variable" '/begin/{print; print f; next}1' input
그러면 해당 내용이 포함된 줄을 찾아서 begin
인쇄한 다음 변수 내용을 인쇄하고 다음 줄로 이동합니다. 기본값은 다른 줄을 인쇄하는 것입니다.
참고: 예제에 표시된 것처럼 변수를 들여쓰지 않습니다.
GNU awk를 사용하면 다음 옵션을 사용하여 파일을 편집할 수 있습니다 -i
.
awk -iv f="$variable" '/begin/{print; print f; next}1' input
다른 모든 버전의 경우 awk
새 파일을 만들어야 합니다.
awk -v f="$variable" '/begin/{print; print f; next}1' input > newfile
필요한 경우 mv
이전 파일을 새 파일로 바꿀 수 있습니다.