次のような数百行のフラット html ファイルを継承しました。
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
これまでのところ、各要素の終了二重引用符を挿入する sed の方法を見つけることができませんでした。おそらく、これを行うには sed 以外の何かが必要です。誰でもこれを行う簡単な方法を提案できますか? ありがとう
次のような数百行のフラット html ファイルを継承しました。
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
これまでのところ、各要素の終了二重引用符を挿入する sed の方法を見つけることができませんでした。おそらく、これを行うには sed 以外の何かが必要です。誰でもこれを行う簡単な方法を提案できますか? ありがとう
sed -i 's/"\([^" >]\+\)\( \|>\)/"\1"\2/g' file.html
説明:
"
- 先頭の二重引用符\([^" >]\+\)
- 引用符またはスペースまたは ' >
' 以外の文字、グループ化 (グループ 1 に)\( \|>\)
- 終了スペースまたは ' >
'、グループ化 (グループ 2 に)「 」に置き換え"<group1>"<group2>
ます。
私が思いついた解決策の 1 つは、引用符を探してファイルの各行を解析することです。フラグが見つかったら、引用符で囲まれた領域内にあることを追跡するフラグをアクティブにし、最初のスペースに到達するまで行の解析を続けるか、その直前に追加の " を挿入します。フラグをオフにして続行します。次の引用符を探して文字列を介して. おそらく完璧な解決策ではありませんが、おそらく開始.
すべての行が同じ構造を共有している場合、単純な texteditor を使用してグローバルに置き換えることができます
' bordercolor'
と
'" bordercolor'
(一重引用符なし)。これはフィールド値から独立しており、他のフィールドでも同様に機能します。まだ手動で作業を行う必要がありますが、それが 1 つの大きなファイルにすぎない場合は、今回は我慢して、おそらく sed ソリューションの作成にこれ以上時間を無駄にすることはありません。
これは、ファイルが単純な場合に行う必要があります-引用符内に空白がある場合は機能しません-その場合、より複雑なコードが必要になりますが、同じ行に沿って実行できます.
#!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()
正規表現はあなたの友達です:
探す: (="[^" >]+)([ >])
交換: \1"\2
それを行った後、これも必ず実行してください:
探す: </?blink>
交換: \n
(これは、要素の複数のクラスを修正しません<element class="class1 class2 id="jimmy">
)
バッシュで
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