web-dev-qa-db-ja.com

行からパターンまですべてを削除し、別のパターンの後をすべて削除するにはどうすればよいですか?

次のファイルで:

Lorem ipsum dolorはamet、conectectuer adipiscing elitに座ります。 Ut eu metus id lectus vestibulum ultrices。マエセナスロンカス。

consectetuerより前のすべてとelitより後のすべてを削除します。

私の望ましい出力:

consectetuer adipiscing elit.

これどうやってするの?

17
manuel

Sedを使用します

sed 's/^.*\(consectetuer.*elit\).*$/\1/' file

Sed s/find/replace /構文をデコードしました。

  • s/^.*-行頭(^)から始めて、その後に(.*)までのすべてを置き換えます...
  • \(-名前付きブロックを開始します
  • consectetuer.*elit\.-最初の単語、最後の単語(この場合、末尾の(エスケープされた)ドットを含む)までのすべての(.*)と一致させます
  • \)-名前付きブロックを終了します
  • 他のすべて(.*)を行末($)に一致させる
  • /-代替検索セクションを終了します
  • \1-上記の\(\)の間の名前ブロックに置き換えます
  • /-置換を終了します
28
MikeV

every lineに開始パターンと終了パターンの両方が含まれる場合、これを行う最も簡単な方法はgrepを使用することです。各行の最初と最後を削除する代わりに、両方のパターン間で内容を出力できます。 -o GNU grepのオプションは一致のみを出力します:

grep -o 'consectetuer.*elit' file

注:前述のように、これはファイルのすべての行がこの方法で解析できる場合にのみ機能します。繰り返しになりますが、これはすべての典型的なユースケースの80%です。

7
slebetman

AWKの2つのforループ:

$ awk '{for(i=1;i<=NF;i++) {if ($i == "consectetuer") beginning=i; if($i== "elit.") ending=i }; for (j=beginning;j<=ending;j++) printf $j" ";printf "\n"   }' file.txt 
consectetuer adipiscing elit.

AWKのgsub:

$ awk '{gsub(/^.*consectetuer/,"consectetuer"); gsub(/elit.*$/,"elit.");print}' file.txt
consectetuer adipiscing elit.
1

Perlの方法。これは基本的に MikeVのsed と同じです。

Perl -pe 's/.*(consectetuer.*elit).*./$1/' file

-pは、「-e "。s/foo/bar/は置換演算子です。 foobarに置き換えます。括弧はパターンをキャプチャし、置換で使用できるようにします。最初にキャプチャされたパターンは$1、 二番目 $2 等々。

したがって、コマンドはconsectetuer.*consectetuer)、次にelit.*elit)そして、行の終わりまでのその他すべて(.*)をキャプチャしたパターンに置き換えます。

1
terdon

この質問のタイトルが「from file」から「from a line "例は1行だけのように見えますが、OPは複数行にわたる可能性を排除していません。とにかく、ここで複数行のソリューションを提供すると役立つ場合があります。

これはクロスラインで機能します:

from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"

例:

[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl

home

def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl

home

def elit
[xiaobai@xiaobai tmp]$ 

参照: シェルパラメーター展開

1
林果皞