ann
첫 번째 줄은 매우 복잡한 값을 보유하는 변수입니다 . 두 번째 행을 사용하는 이유는 세 번째 행에서는 아무것도 변경하고 싶지 않기 때문입니다 col1content
. 대체를 변경하려면 두 번째 줄을 다른 변수로 변경하면 됩니다.
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'<\/h2>'; echo views_embed_view('frprev_ann'); ?>"
col1content=`echo $ann`
sed -i 's/r'$rownum'c1content/'$col1content'/g' templates/page--front.tpl.php
그러나 위의 명령을 실행하면 오류가 발생합니다.
sed: -e expression #1, char 19: unterminated `s' command
첫 번째 줄을 로 변경하면 ann="testtext"
모든 것이 원활하게 작동합니다. 첫 번째 줄을 로 변경하면 ann="<?first second"
실패합니다. 백슬래시를 사용해도 나에게는 도움이 되지 않습니다.
답변1
sed -i 's/r'$rownum'c1content/'"$col1content"'/g' templates/page--front.tpl.php
답변2
이와 같은 텍스트는 안정적으로 전달할 수 없습니다 sed
. 대체 텍스트에서는 앞에 백슬래시를 추가하여 인용 \
하고 &
구분해야 합니다(일반적으로). 정규식 부분에는 따옴표 와 구분 기호가 필요합니다.s
/
\[.*^$
또한 셸에서 추가 확장을 위해 변수 값을 보존합니다.변수 대체에는 항상 큰따옴표를 사용하십시오., 즉 "$foo"
, 아니오 . 큰따옴표가 없으면 값은 공백으로 구분된 공백 패턴 목록으로 해석됩니다 $foo
\[?*
.
스크립트 작동 방식을 변경하고 싶지 않다면 모든 내용을 올바르게 인용하세요.
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'</h2>'; echo views_embed_view('frprev_ann'); ?>"
col1content=$(echo "$ann" | sed 's/[\\\/&]/\\&/g')
sed -i "s/r${rownum}c1content/${col1content}/g" templates/page--front.tpl.php
또는 스크립트에서 환경 변수를 읽을 수 있는 awk 또는 perl을 사용하십시오.
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'</h2>'; echo views_embed_view('frprev_ann'); ?>"
awk -v ann="$ann" -v rownum="$rownum" '
BEGIN {pattern = "r" rownum "c1content"; }
1 {gsub(pattern, ann); print}
' templates/page--front.tpl.php >templates/page--front.tpl.php.new
mv templates/page--front.tpl.php.new templates/page--front.tpl