sed
xスペースで始まり、yスペースで終わる切り取りテキストを使用する方法は?
たとえば、これは私の文字列です。
kkk 111 fff aaabbb 5d98 ccc mmmppp 9369d
私は次のような出力を得たいと思います。
aaabbb 5d98 ccc
(スペース数は不明)
ありがとうございます。
答え1
私たちは空白の量を知らないいくつかのテキストについて話しています。
sed 's/.* \{2,\}\([[:alnum:]].*\) \{2,\}.*/\1/'
または -r(-E) を使用して
sed -E 's/.* {2,}([[:alnum:]].*) {2,}.*/\1/'
適切なようですが、grep
この場合はより良いです。
grep -Po ' {2,}\K[[:alnum:]].*(?= {2,})'
それほど強力ではありませんが(ただ2つのカーンのみ)、正確です。
sed -E 's/.* (\w.*) .*/\1/'
答え2
-r
編集:バックラッシュの炎症を治療するためにjimmij(拡張正規表現構文活性化)からフラグを借りました。
次の条件で次の操作を実行します。
- フィールド区切り文字が最小限であると言えますか?Nスペース(例:3)
- 対象フィールドの内容にはスペースは含まれません。
この場合、次の正規表現が機能します。
echo ' 01 Title Chapter 01' |
sed -r 's/^.* {3,}([^ ]+) {3,}.*$/\1/'
あるいは、バックスラッシュを好む場合、拡張されていない正規表現構文は次のようになります。
echo ' 01 Title Chapter 01' |
sed 's/^.* \{3,\}\([^ ]\+\) \{3,\}.*$/\1/'
正規表現の説明:
^ start of line
.* any number of characters at the start of the line
{3,} at least 3 spaces
([^ ]+) 1 or more non-space characters (capture this group as \1)
{3,} at least 3 spaces
.* anything on the rest of the line
$ end of the line. Not needed, because of the .*, but nicely explicit.
答え3
両側に同じ数の空白が欲しいとします。
$ sed -r 's/(^|.*[^[:space:]])([[:space:]]+)([^[:space:]]+)\2([^[:space:]].*|$)/\3/g' <<<"01 Title Chapter 01"
Title
(単純な空白ではなく文字クラスを使用したため、表現ははるかに短くなければなりません
sed -r 's/(^|.*[^ ])( +)([^ ]+)\2([^ ].*|$)/\3/g'
。 )
LHSの逆参照を使用して、両側に同じ数のスペースがあることを確認します。
答え4
-r
内部文字数を指定できる拡張正規表現オプションを使用できるため、{}
以下はすべて印刷されます。性格6つの空間に囲まれています。
sed -r 's/.* {6}(\w*) {6}.*/\1/'
仮に備えてタイトルスペースもあります。より良いオプションは次のとおりです。
sed -r 's/.* {6}(.*) {6}.*/\1/'