WIKI_CODE=$(cat <<ZZZWCZZZ
<!--BEGIN-->
<div class="mw-collapsible" style="text-align:left;" data-collapsetext="Hide" data-expandtext="Show">
<div class="mw-collapsible-content">
<div class="mw-collapsible mw-collapsed" style="text-align:left">
<div class="mw-collapsible-toggle" style="text-align:left; float: none;">
</div>
<span title="
BLAH TITLE FOR BLAH
1) blah...
2) blah,blah...;
blah blah blah...
3) more blah:
blah on another line...
4) EMPTY Question4
5) EMPTY Question5
">Begin Blah Questions (Hover over me)</span> [[#Hover|Hover]]
<!--END-->
ZZZWCZZZ
);
#echo "$WIKI_CODE";
WIKI_TITLE="=My Wiki Title=";
NEW_SECTION=$(echo -e "$WIKI_CODE";);
#echo "$NEW_SECTION";
sed -i "s/$WIKI_TITLE/$NEW_SECTION/g" $DOC_FILE;
我得到以下错误:
sed:-e表达式#1,char 75:未终止的"s"命令
我试着引用所有内容,但仍然不起作用。
NEW_SECTION=$(echo $NEW_SECTION | sed -e 's/./\&/g; 1!s/^/"/; $!s/$/"/' );
#echo "$NEW_SECTION";
sed -i "s/$WIKI_TITLE/$NEW_SECTION/g" $DOC_FILE;
我得到以下错误:
sed:-e表达式#1,char 1607:"s"命令的RHS上的无效引用\9
您看到的错误消息是sed
试图告诉您,在s
命令终止之前,它遇到了脚本的结束分隔符。
由于您的起始分隔符是"
,这意味着它被替换文本中的一个"
阻塞了。这意味着您需要使用来转义替换文本中的所有
"
字符。
我创建了一个名为DocFile
的文件,并在其中放入以下内容:
=My Wiki Title=
然后,我运行了以下命令,成功地将$NEW_SECTION
的内容注入到文件中。请注意,正如shelter建议的那样,我在最后的sed
命令中使用分隔符@
,因为@
字符不会出现在文本中。还要注意,在第二个和第三个语句之后,$NEW_SECTION
中会有文字字符"
,但最终语句有效地消耗了它们,因此它们不会出现在最终输出中。
NEW_SECTION=$(echo -e "$WIKI_CODE";);
NEW_SECTION=$(echo $NEW_SECTION | sed -e 's!"!\"!g' );
NEW_SECTION=$(echo $NEW_SECTION | sed -e 's/&/\&/g')
sed -i "s@$WIKI_TITLE@$NEW_SECTION@g" DocFile
您无法用sed可靠地执行您想要的操作,因为sed处理RE,而不是字符串,并且sed要求搜索和替换文本不包含您用作分隔符的任何特定字符。所以,只需使用awk(未经测试,但应该很接近(:
awk -v old="$WIKI_TITLE" -v new="$NEW_SECTION" '
s=index($0,old){$0 = substr($0,1,s-1) new substr($0,s+length(old))}
1' file
以上内容将适用于搜索字符串或替换字符串中的任何字符。
对于较新的gawks,您可以使用-i inplace
进行伪就地编辑,就像sed使用它的-i
arg一样,否则只需在命令末尾添加> tmp && mv tmp file
即可更改原始文件。