sedを使用してnスペースで始まり、nスペースで終わる文字列を切り捨てる

sedを使用してnスペースで始まり、nスペースで終わる文字列を切り捨てる

sedxスペースで始まり、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/'

関連情報