
ブックマーク ファイルに Chrome の一致パターンを使用するか、同様に使用したい場合は、一致に基づいてawk
さまざまなフィールド区切り文字に基づいて特定のフィールドを切り取ります。
サンプル写真を添付しました。ファイルとして追加する方法が見つかりませんでした。
H3
フォルダ名(文字列が一致する場合)とURL(HREF
文字列がある場合)が必要です。
次の2つのコマンドは対応する一致操作を完了します。
awk -F'[<>]' '/H3/{print $5}' bookmarks.htm
awk -F'"' '/HREF/{print $2}' bookmarks.html
私の目標は、上記の2つのステートメントを組み合わせて出力を次のようにすることです。
UNIX
url-1
url-2
OCE
url-3
url-4
url-5
ANDROID
url-6
url-7
「if」、「then」、「else」を試しましたが、awk
役に立ちませんでした。
どうやってこれを達成できますか?それより良い候補がありますかawk
? python、perlはすべて素晴らしいですが、そのタスクを実行するシェルスクリプトを書くのは簡単な作業なので、1行だけ考える必要はありません。
答え1
これはHTMLファイルを処理する誤った方法です。sed/アッ/...特殊パーサーはほとんどありませんが、一時的な代替として使用されます。
sed '
/\n/{P;d;}
/<H3/s/[><]/\n/4g
/HREF/s/"/\n/g
D
' bookmarks.htm
GNU以外のバージョンの場合sed:
sed '
/\n/{P;d;} #if there is more then 1 line «P»rint 1st line then «d»elete all
/<\/H3/s//\n/ #replace «</H3» by «\n»ewline
/\n/s/">/\n/ #replace «">» by «\n»ewline if previous command is executed
/HREF/s/"/\n/g #put «\n»ewline» around url if «HREF» in line
D #«D»elete 1 first line, go to start
' bookmarks.htm
答え2
xml/htmlパーサー/プロセッサを使用すると、いくつかの利点があります。Xパス式は特定の部品を選択する標準的な方法です。
xml + xmlstarlet + xpath
入力が正しい形式のxmlの場合は、xmlstarlet + xpath式を使用できます。
xmlstarlet sel -t -v '//h3|//a/@href' -nl bookmarks.html
html+xmllint:xml
入力が有効なHTMLの場合は、それをxmlに変換できます(次を使用)。xmllint)以前を使用してください。
xmllint -html -xmlout ex.html | xmlstarlet sel -t -v '//h3|//a/@href' -nl -
xmllint + xpath
xmllint + xpath式を直接使用できます
xmllint -html -xpath '//h3/text()|//a/@href' bookmarks.html
...しかし、出力形式が異なります...
答え3
最後の答え:今回はライオンパールです。
perl -nE 'say $1 if (/<h3.*?>(.*?)<\/h3>/i or /href="(.*?)"/i)' ex.html
(私はXMLパーサーベースのソリューションがより良いと思います。しかし、ツール生成ファイルがあるので驚くべきことはたくさんありません。)
答え4
今私はキップの必要性をあきらめ、ただ台本にしました。
コメントが長すぎてこのように答えました。しかし、自由に答えてください。
このスクリプトは操作を実行しますが、遅すぎます。スピードアップやジョークを提案できる人はいますか?
#!/bin/sh
file=$1
while IFS= read -r line
do
hdr=$(echo $line | awk -F'[<>]' '/H3/{print $5}')
url=$(echo $line | awk -F'"' '/HREF/{print $2}')
if [ ${url} ]; then
echo $url
elif [ ${hdr} ]; then
echo $hdr
fi
done <"$file"
ファイルは次のようになります。 (ついに得ました)
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>Bookmarks</h1>
<dl>
<dd>
<DT><H3 ADD_DATE="1484311924" LAST_MODIFIED="1485532328">UNIX</H3>
<dl>
<dt><a HREF="http://unix.stackexchange.com/questions/223182/how-to-replace-spaces-in-all-file-names-with-underscore-in-linux-using-shell-scr" add_date="1484311897">url-1</a></dt>
<dt><a HREF="http://unix.stackexchange.com/questions/81349/how-do-i-use-find-when-the-filename-contains-spaces" add_date="1484738308">url-2</a></dt>
</dl>
</dd>
<dd>
<DT><H3 ADD_DATE="1486550854" LAST_MODIFIED="1487228526">OCE</H3>
<dl>
<dt><a HREF="http://www.oraclecertificationprep.com/apex/f?p=OCPSG%3AEXAM_DETAILS%3A%3A%3ANO%3A%3AP2_EXAM%3A1Z0-061" add_date="1486550866">url-3</a></dt>
<dt><a HREF="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=303&p_certName=SQ1Z0_047" add_date="1486550898">url-4</a></dt>
<dt><a HREF="https://www.quora.com/How-do-you-prepare-for-an-Oracle-Database-SQL-exam" add_date="1486550950">url-5</a></dt>
</dl>
</dd>
<dd>
<DT><H3 ADD_DATE="1487084050" LAST_MODIFIED="1487228595">ANDROID</H3>
<dl>
<dt><a HREF="https://material.io/guidelines/style/color.html#" add_date="1487228526">url-6</a></dt>
<dt><a HREF="https://developer.android.com/index.html" add_date="1487228539">url-7</a></dt>
</dl>
</dd>
</dl>
</body>
</html>