MediaWiki-引用wiki代码,以便用sed命令替换它


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&#13;
1) blah...&#13;
2) blah,blah...;&#13;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blah blah blah...&#13;
3) more blah:&#13;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blah on another line...&#13;
4)  EMPTY Question4&#13;
5)  EMPTY Question5&#13;
">Begin Blah Questions (Hover over me)</span>&nbsp;&nbsp;&nbsp;[[#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即可更改原始文件。

最新更新