0

私はperl、awk、またはsedにあまり精通しておらず、しばらくの間Webで問題の解決策を探していましたが、あまり成功しませんでした。

交換したい

<math> ... </math>

<math>\begin{align} ... \end{align}</math>

...含まれている場合\\。私の問題は、<math>タグ間の文字列が複数の行にまたがることがあることです。1行内のタグをsedに置き換えることができましたが、複数行で実行できませんでした。

perl、awk、またはsedを使用した単純なソリューションは大歓迎です。どうもありがとう。

4

3 に答える 3

1

タグごとに個別の式を使用すると、スクリプトは複数行の影響を受けなくなります。

sed -e 's,<math>,&\\begin{align},g' -e 's,</math>,&\\end{align},g' 

編集:マルチラインawkバージョン:

awk '/<math>/,/<\/math>/ {
  if (index($0, "<math>")) { 
    a=$0
  } else {
    b = b $0
  }
  if (index($0, "</math>")) {
    if (index(b,"\\\\")) {
      sub("<math>","&\\begin{align}", a)
      sub("</math>","\\end{align}&", b)
    }; 
    print a,b
    a=""
    b=""
  } 
}'
于 2012-07-02T17:37:19.567 に答える
0

次のperlコマンドを試してください。使い方?コンテンツファイルをslurpモードで読み取り、$f変数に保存し、後でシングルモードで正規表現を追加して(改行をと一致させます.\begin{regex}数学タグの間に\end{regex}見つかった場合。\\

perl -e '
    do { 
        $/ = undef; 
        $f = <> 
    }; 
    $f =~ s#(<math>)(.*\\\\.*)(</math>)#$1\\begin{align}$2\\end{align}$3#s; 
    printf qq|%s|, $f
' infile
于 2012-07-02T18:04:43.700 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed ':a;$!{N;ba}
/[\x00\x01\x02]/q1
s/<math>/\x00/g
s/<\/math>/\x01/g
s/\\\\/\x02/g
s/\x00\([^\x01\x02]*\)\x01/<math>\1<\/math>/g
s/\x00/<math>\\begin{align}/g
s/\x01/\\end{align}<\/math>/g
s/\x02/\\\\/g' file
于 2012-07-03T12:51:07.587 に答える