Awk

使用sed用<i> </i>封裝每段的第一個詞?

  • April 23, 2019

所以很明顯我正在嘗試在一個巨大的文件中將每個段落的第一個單詞斜體。我認為添加前綴相對容易,但我如何只描述後綴的第一個單詞而不是行尾?該文件應以空格分隔。

sed -e 's/^/&lt;i&gt;/' file &gt; file.new

我是否需要使用不同的語法執行 sed 兩次,或者這是否可以使用一個命令?我正在輸出到一個新文件,以防我搞砸了。

以下是文件幾行的範例:

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.

我希望它如下所示:

&lt;i&gt;Snapdragon&lt;/i&gt;  Plant with a two-lipped flower.

&lt;i&gt;Snap-fastener&lt;/i&gt;  = *press-stud.

&lt;i&gt;Snapper&lt;/i&gt;  Any of several edible marine fish.

&lt;i&gt;Snappish&lt;/i&gt;  1 curt; ill-tempered; sharp. 2 inclined to snap.

並非所有的行都是單行的,有些術語有多個定義行。

使用 sed,

  • 如果行首有一個字母,那麼
  • 擷取任意數量的非空白字元和
  • &lt;i&gt;用周圍的…替換那些擷取的字元&lt;/i&gt;

像這樣:

sed '/^[a-zA-Z]/ s!\([^ ]*\)!&lt;i&gt;\1&lt;/i&gt;!' &lt; file &gt; 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.

輸出是:

&lt;i&gt;Snapdragon&lt;/i&gt;  Plant with a two-lipped flower.

&lt;i&gt;Snap-fastener&lt;/i&gt;  = *press-stud.

&lt;i&gt;Snapper&lt;/i&gt;  Any of several edible marine fish.

&lt;i&gt;Snappish&lt;/i&gt;  1 curt; ill-tempered; sharp. 2 inclined to snap.

要分解 sed 命令的各個部分:

  • /^[a-zA-Z]/– 這是一個地址過濾器;這意味著僅將後續命令應用於與此正則表達式匹配的行。正則表達式要求一個字母(小寫a-z或大寫A-Z)必須跟在行的開頭^
  • s!\([^ ]*\)!&lt;i&gt;\1&lt;/i&gt;!– 這是搜尋和替換命令。它在搜尋和替換之間使用分隔符;常見的分隔符是正斜杠,但由於替換文本有正斜杠,我將分隔符更改為驚嘆號!。搜尋詞有兩部分:擷取括號,必須被轉義,正則表達式[^ ]*,它說:“匹配任何東西,除了空格,零次或多次*。替換文本引用回擷取的文本用 HTML 標籤分組\1並包圍它。

要另外用段落標籤包裝每個非空行,請添加另一個 sed 表達式:

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

附加表達式說:

  • 匹配具有一個(任何)字元的行——這會跳過空行
  • {將接下來的兩個命令組合在一起
  • ^搜尋並用開始段落標記替換行首
  • $搜尋並用結束段落標記替換行尾
  • }結束分組

引用自:https://unix.stackexchange.com/questions/453894