次のファイルで:
Lorem ipsum dolorはamet、conectectuer adipiscing elitに座ります。 Ut eu metus id lectus vestibulum ultrices。マエセナスロンカス。
consectetuer
より前のすべてとelit
より後のすべてを削除します。
私の望ましい出力:
consectetuer adipiscing elit.
これどうやってするの?
Sedを使用します
sed 's/^.*\(consectetuer.*elit\).*$/\1/' file
Sed s/find/replace /構文をデコードしました。
s/^.*
-行頭(^
)から始めて、その後に(.*
)までのすべてを置き換えます...\(
-名前付きブロックを開始しますconsectetuer.*elit\.
-最初の単語、最後の単語(この場合、末尾の(エスケープされた)ドットを含む)までのすべての(.*
)と一致させます\)
-名前付きブロックを終了します.*
)を行末($
)に一致させる/
-代替検索セクションを終了します\1
-上記の\(
と\)
の間の名前ブロックに置き換えます/
-置換を終了しますevery lineに開始パターンと終了パターンの両方が含まれる場合、これを行う最も簡単な方法はgrep
を使用することです。各行の最初と最後を削除する代わりに、両方のパターン間で内容を出力できます。 -o
GNU grep
のオプションは一致のみを出力します:
grep -o 'consectetuer.*elit' file
注:前述のように、これはファイルのすべての行がこの方法で解析できる場合にのみ機能します。繰り返しになりますが、これはすべての典型的なユースケースの80%です。
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.
Perlの方法。これは基本的に MikeVのsed
と同じです。
Perl -pe 's/.*(consectetuer.*elit).*./$1/' file
-p
は、「-e
"。s/foo/bar/
は置換演算子です。 foo
をbar
に置き換えます。括弧はパターンをキャプチャし、置換で使用できるようにします。最初にキャプチャされたパターンは$1
、 二番目 $2
等々。
したがって、コマンドはconsectetuer
(.*consectetuer
)、次にelit
(.*elit
)そして、行の終わりまでのその他すべて(.*
)をキャプチャしたパターンに置き換えます。
この質問のタイトルが「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]$
参照: シェルパラメーター展開