sed拡張正規表現

sed拡張正規表現

明らかに、私は巨大な文書ですべての段落の最初の単語をイタリック体で表示しようとしているようです。接頭辞を付けるのは比較的簡単だと思いますが、行末ではなく接尾辞の最初の単語だけを表現するにはどうすればよいですか?ファイルはスペースで区切る必要があります。

sed -e 's/^/<i>/' file > file.new

別の構文でsedを2回実行する必要がありますか、それとも1つのコマンドを使用してこれを達成できますか?もしかしたら問題が発生するかと、新しいファイルとして出力しています。

以下は、ファイルのいくつかの例の行です。

Snapdragon  Plant with a two-lipped flower.

Snap-fastener  = *press-stud.

Snapper  Any of several edible marine fish.

Snappish  1 curt; ill-tempered; sharp. 2 inclined to snap.

私はそれが次のように見えるようにしたいです:

<i>Snapdragon</i>  Plant with a two-lipped flower.

<i>Snap-fastener</i>  = *press-stud.

<i>Snapper</i>  Any of several edible marine fish.

<i>Snappish</i>  1 curt; ill-tempered; sharp. 2 inclined to snap.

すべての行が1行ではなく、一部の用語には複数行定義があります。

ベストアンサー1

sedを使用して、

  • 行の先頭に文字がある場合
  • 空白以外の文字を好きなだけキャプチャし、
  • キャプチャされた文字を周囲の文字に置き換えます<i></i>

このように:

sed '/^[a-zA-Z]/ s!\([^ ]*\)!<i>\1</i>!' < file > file.new

この入力例では、次のようになります。

Snapdragon  Plant with a two-lipped flower.

Snap-fastener  = *press-stud.

Snapper  Any of several edible marine fish.

Snappish  1 curt; ill-tempered; sharp. 2 inclined to snap.

出力は次のとおりです

<i>Snapdragon</i>  Plant with a two-lipped flower.

<i>Snap-fastener</i>  = *press-stud.

<i>Snapper</i>  Any of several edible marine fish.

<i>Snappish</i>  1 curt; ill-tempered; sharp. 2 inclined to snap.

sed コマンドの一部を分析すると、次のようになります。

  • /^[a-zA-Z]/- これはアドレスフィルタです。つまり、後続のコマンドは、この正規表現に一致する行にのみ適用されます。正規表現では、a-z行の先頭の後に文字(小文字または大文字)が必要です。A-Z^

  • s!\([^ ]*\)!<i>\1</i>!- 検索と置換コマンド。検索と置換の間に区切り文字を使用しますが、一般的な区切り文字はスラッシュですが、代替テキストにはスラッシュがあるため、区切り文字を感嘆符に変更しました!。検索語は、キャプチャ括弧(エスケープする必要があります)と[^ ]*「空白を除くすべての項目と0回以上一致する」という正規表現の2つの部分で構成されています*。代替テキストはキャプチャされたコンテンツを再参照し\1、それをHTMLタグにグループ化します。囲まれています。

空白ではなく各行を段落タグでさらに囲むには、別のsed式を追加します。

sed -e '/^[a-zA-Z]/ s!\([^ ]*\)!<i>\1</i>!' -e '/./ { s/^/<p>/; s!$!</p>! }' < file

追加の表現は次のことを意味します。

  • 1文字を含む行と一致 - 空の行をスキップします。
  • {次の2つのコマンドを組み合わせる
  • 行の先頭を検索して、^開いている段落タグに置き換えます。
  • $行末を検索して、閉じる段落タグに置き換えます。
  • }最終グループ

おすすめ記事