텍스트 파일의 특정 단어 뒤에 변수를 추가하는 방법은 무엇입니까?

텍스트 파일의 특정 단어 뒤에 변수를 추가하는 방법은 무엇입니까?

텍스트 파일에서 "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이전 파일을 새 파일로 바꿀 수 있습니다.

관련 정보