![sed を使用して最後の [重複] ではなく、行の最初の一致を見つけて置き換えます](https://linux33.com/image/181263/sed%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%9C%80%E5%BE%8C%E3%81%AE%20%5B%E9%87%8D%E8%A4%87%5D%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%E8%A1%8C%E3%81%AE%E6%9C%80%E5%88%9D%E3%81%AE%E4%B8%80%E8%87%B4%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%A6%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%BE%E3%81%99.png)
次のsedコマンドがあります。
sed 's/\('\''\).*div><div>/,/'
'
一重引用符の間のすべての内容を取得div><div>
し、コンマで置き換えます,
。私が望むものに非常に近い動作します。ただし、一部の行には2行が含まれており、div><div>
私のコマンドには2行目が停止点になっているため、1行目から切り取ろうとしています。
より明確に説明するために、データを抽出するファイルの行は次のとおりです。
'>Person A</a></div><div>Teaching A</div></div></td><td width='50%'><div style='height: 50px; margin-bottom: 6px;'><div style='font-weight:bold'>Unknown or external</div><div>Teaching B<
Teaching A
私の出力が次のようになるまですべてを交換しようとしています,Teaching A
。しかし、私が得た結果は,Teaching B
。
div><div>
最後のインスタンスの代わりに最初のインスタンスを取得するようにsedコマンドをどのように操作できますか?
答え1
@ AdminBee:また、貪欲ではないマッチングを提案したいと思います。
@ Dr Little:あなたのソリューションは何ですか?私たちに教えてください。
私が正しく理解したなら、これもうまくいくでしょう:
sed 's/\('\''\).*<.a><div><div>/,/'
。
正規表現を使用してHTMLファイルを解析することはお勧めできません。たとえば、一度はvim + regexを使用して数十から数千のHTMLファイルを解析しましたが、これは時間に敏感な作業でした。なぜ?これは、実際のXML / HTMLパーサーを使用してテキストファイルを解析し、行とデータを抽出すると、タスクがより早く完了できるためです。