
入力する:
<tr><td>FOOBAAR</td><td>FOOO</td><td>BAAR</td><td><font style=BACKGROUND-COLOR:red>2014-02-14 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-02-17 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-03-07 13:34</font></td></tr>
出力:
<tr><td>FOOBAAR</td><td>FOOO</td><td>BAAR</td><td>2014-02-14 13:34</td><td><font style=BACKGROUND-COLOR:red>2014-02-17 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-03-07 13:34</font></td></tr>
違い:
<font style=BACKGROUND-COLOR:red>
そして
</font>
4番目の列からのみ削除します。
私の質問:与えられた列から与えられた文字列だけを削除するには?
</td><td>
区切り記号
答え1
正規表現を使用するよりもHTML解析ツールを使用する方が良いです。 (有名な答えが理由を説明します。ここ)
以下はXMLパーサーを使用する例です(注:入力は正しい形式のXMLでなければなりませんが、サンプルHTMLはそうではありません)。
# change the value of the style attribute of the font tag of the 4th td tag
# to the empty string
xmlstarlet ed -O -u '//table/tr/td[4]/font[@style]/@style' -v "" <<END
<html><head></head><body><table>
<tr><td>FOOBAAR</td><td>FOOO</td><td>BAAR</td><td><font style="BACKGROUND-COLOR:red">2014-02-14 13:34</font></td><td><font style="BACKGROUND-COLOR:red">2014-02-17 13:34</font></td><td><font style="BACKGROUND-COLOR:red">2014-03-07 13:34</font></td></tr>
</table></body></html>
END
<html>
<head/>
<body>
<table>
<tr>
<td>FOOBAAR</td>
<td>FOOO</td>
<td>BAAR</td>
<td>
<font style="">2014-02-14 13:34</font>
</td>
<td>
<font style="BACKGROUND-COLOR:red">2014-02-17 13:34</font>
</td>
<td>
<font style="BACKGROUND-COLOR:red">2014-03-07 13:34</font>
</td>
</tr>
</table>
</body>
</html>
答え2
これはうまくいくかもしれません。
#!/bin/sh
# replace specific strings from the fourth column
INSTRING="<tr><td>FOOBAAR</td><td>FOOO</td><td>BAAR</td><td><font style=BACKGROUND-COLOR:red>2014-02-14 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-02-17 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-03-07 13:34</font></td></tr>"
DEL_STRING1="<font style=BACKGROUND-COLOR:red>"
DEL_STRING2="</font>"
DELIM="</td><td>"
OUT_FIRST=`echo $INSTRING | awk -F $DELIM '{print $1,$2,$3,$4}' OFS="</td><td>"`
OUT_FIRST=`echo $OUT_FIRST | awk -F "$DEL_STRING1" '{print $1,$2}' OFS=""`
OUT_FIRST=`echo $OUT_FIRST | awk -F "$DEL_STRING2" '{print $1}'`
OUT_LAST=`echo $INSTRING | awk -F $DELIM '{print substr($0, index($0,$5))}' OFS=$DELIM`
echo "$OUT_FIRST$DELIM$OUT_LAST"
答え3
awk 1行コマンド、
$ awk -F '<\/td><td>' 'BEGIN{OFS=FS;} {gsub (/<font style=BACKGROUND-COLOR:red>/,"",$4); gsub (/<\/font>/,"",$4);}1' file 2>/dev/null
<tr><td>FOOBAAR</td><td>FOOO</td><td>BAAR</td><td>2014-02-14 13:34</td><td><font style=BACKGROUND-COLOR:red>2014-02-17 13:34</font></td><td><font style=BACKGROUND-COLOR:red>2014-03-07 13:34</font></td></tr>
答え4
sed 's|</td><td>|</td>\nTGT_LINE_MARKER<td>|4' |
sed '\|TGT_LINE_MARKER|{function applied to target field}'