1

次のような数百行のフラット html ファイルを継承しました。

<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>

これまでのところ、各要素の終了二重引用符を挿入する sed の方法を見つけることができませんでした。おそらく、これを行うには sed 以外の何かが必要です。誰でもこれを行う簡単な方法を提案できますか? ありがとう

4

6 に答える 6

1
sed -i 's/"\([^" >]\+\)\( \|>\)/"\1"\2/g' file.html

説明:

  • "- 先頭の二重引用符
  • \([^" >]\+\)- 引用符またはスペースまたは ' >' 以外の文字、グループ化 (グループ 1 に)
  • \( \|>\)- 終了スペースまたは ' >'、グループ化 (グループ 2 に)

「 」に置き換え"<group1>"<group2>ます。

于 2009-12-10T17:06:11.800 に答える
0

私が思いついた解決策の 1 つは、引用符を探してファイルの各行を解析することです。フラグが見つかったら、引用符で囲まれた領域内にあることを追跡するフラグをアクティブにし、最初のスペースに到達するまで行の解析を続けるか、その直前に追加の " を挿入します。フラグをオフにして続行します。次の引用符を探して文字列を介して. おそらく完璧な解決策ではありませんが、おそらく開始.

于 2009-12-10T16:27:21.527 に答える
0

すべての行が同じ構造を共有している場合、単純な texteditor を使用してグローバルに置き換えることができます

' bordercolor'

'" bordercolor'

(一重引用符なし)。これはフィールド値から独立しており、他のフィールドでも同様に機能します。まだ手動で作業を行う必要がありますが、それが 1 つの大きなファイルにすぎない場合は、今回は我慢して、おそらく sed ソリューションの作成にこれ以上時間を無駄にすることはありません。

于 2009-12-10T16:29:02.320 に答える
0

これは、ファイルが単純な場合に行う必要があります-引用符内に空白がある場合は機能しません-その場合、より複雑なコードが必要になりますが、同じ行に沿って実行できます.

#!usr/bin/env python

#change the "utf-8" bellow to your files encoding
data = open("<myfile.html>").read().decode("utf-8")
new_data = []

inside_tag = False
inside_quotes = False
for char in data:
    if char == "<":
        inside_tag = True
    if char == '"':
        inside_quotes = True
    if inside_tag and (char.isspace() or char==">") and inside_quotes:
        new_data.append('"')
        inside_quotes = False
    if char == ">":
        inside_tag = False
    new_data.append(char)


outputfile = open("<mynewfile.html>", "wt")

outputfile.write("".join(new_data).encode("utf-8"))
outputfile.close()
于 2009-12-10T16:34:40.650 に答える
0

正規表現はあなたの友達です:

探す: (="[^" >]+)([ >])

交換: \1"\2

それを行った後、これも必ず実行してください:

探す: </?blink>

交換: \n

(これは、要素の複数のクラスを修正しません<element class="class1 class2 id="jimmy">)

于 2009-12-10T17:31:47.593 に答える
0

バッシュで

for file in *
do
    flag=0
    while read -r line
    do
        case "$line" in
            *"<blink>"*)
                flag=1
                ;;
        esac
        if [ "$flag" -eq 1 ];then
            case "$line" in
                *class=\"pagetxt*">" )
                    line="${line%>}\">"
                    flag=0
                    ;;
            esac
        fi
        echo "${line}"
    done <"file" > temp
    mv temp "$file"
done
于 2009-12-11T00:09:55.237 に答える