sed 명령은 일부 줄을 추가합니다

sed 명령은 일부 줄을 추가합니다

sed를 사용하여 bash 스크립트를 통해 일부 줄을 추가하고 싶습니다. 스크립트는 작동하지만 출력이 잘못되었습니다.

LINEB="word"
sed '/g id=\"..\"/a style=\"fill:$LINEB;\"' file.txt > foo.txt

내가 <g id="ai" style="fill:$LINEB;">대신 받음<g id="ai" style="fill:word;">

다양한 괄호를 사용하더라도.

답변1

작은따옴표 안에 변수를 포함할 수 없습니다. 당신은 할 수 있습니다:

  1. 전체 sed 스크립트 주위에 큰따옴표를 사용하고 그 안에 있는 큰따옴표를 백슬래시로 이스케이프 처리하세요.

  2. 작은따옴표로 묶인 문자열을 큰따옴표로 묶은 변수로 끝내고 '작은따옴표로 묶인 문자열을 다시 시작하세요.

LINEB="word"
sed '/g id=\"..\"/a style=\"fill:'"$LINEB"';\"' file.txt > foo.txt

답변2

$LINEB먼저, pend 명령을 올바르게 준비하도록 주의를 기울여야 합니다 sed a.

sed '/<\([^"<>]*\("[^"]*"\)* \)*g id="[^"][^"]"/a\'"$(echo;#"'
     printf 'style="fill:"%s"\n' "$LINEB" |
     sed 'H;1h;$!d;s/\\/&&/g;s/\n/\\&/g')
"    <infile >outfile

또한 다른 파일에서 추가 텍스트를 찾는 것이 a더 쉬울 수도 있습니다 . 그런 다음 r적절한 경우 읽을 수 있습니다.

printf 'style="fill:%s"\n' "$LINEB" >/tmp/LINEB
sed '/<\([^"<>]*\("[^"]*"\)* \)*g id="[^"][^"]"/r /tmp/LINEB' <infile >outfile
rm /tmp/LINEB

이스케이프가 필요하지 않습니다.

관련 정보