明らかに、私は巨大な文書ですべての段落の最初の単語をイタリック体で表示しようとしているようです。接頭辞を付けるのは比較的簡単だと思いますが、行末ではなく接尾辞の最初の単語だけを表現するにはどうすればよいですか?ファイルはスペースで区切る必要があります。
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つのコマンドを組み合わせる- 行の先頭を検索して、
^
開いている段落タグに置き換えます。 $
行末を検索して、閉じる段落タグに置き換えます。}
最終グループ
答え2
次の方法でこれを実行できますsed
。
$ sed '/^$/n;s#^\([^ ]*\)#<i>\1</i>#' input.txt
<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
2つが含まれています。最初のブロックは空の行を検出して/^$/
スキップしますn
。
- 空白行をスキップ
/^$/n
2番目のブロックはすべての困難な操作を実行し、スペースをs#..#..#
含まない部分文字列を検出します\([^ ]*\)
。パターンはラップして「保存」するため、\(..\)
後でから再利用できます\1
。
- 部分文字列を最初のスペースと一致
\([^ ]*\)
- 一致を保存
\1
し、次のようにラップします。<i>...</i>
答え3
awkを試してみてください。
awk '{$1="<i>$1</i>"; print $0}' file > file.new
答え4
sed
拡張正規表現
行をインデントするかどうかにかかわらず、代替パターンのクエリを表すために、最初の(空白ではない)文字サブストリングの周りに<i>
マーカーを配置します。</i>
[^[:space:]]
&
-E
アクティブ化のためのsed
拡張正規表現:
sed -E 's/[^[:space:]]+/<i>&<\/i>/' file
区切られた検索と代替用語を使用する場合は、他の前に/
来る必要があります(ここでは2番目のタグと同じです)。これらの文字が用語に表示されない限り、区切り文字検索語と代替用語以外の文字を使用してこの追加手順を回避できます。たとえば、次のようにコンマを使用します。/
\
/
sed -E 's,[^[:space:]]+,<i>&</i>,' file
これが最短の方法です。
(1つ以上のパターン発生を示す)は、正規表現ではなく通常の式では機能しませんが+
(ゼロ以上の発生を示す)を使用すると、もう少し入力するだけで同じことができます。-e
-E
*
sed -e 's,[^[:space:]][^[:space:]]*,<i>&</i>,' file