次のファイル:
Lorem ipsum dolor sit amet、consectetuer adipiscing elit。Ut eu metus id lectus vestibulum ultrices。Maecenas rhoncus。
前consectetuer
とすべてを削除したいelit
。
私の希望する出力:
consectetuer adipiscing elit.
これどうやってするの?
次のファイル:
Lorem ipsum dolor sit amet、consectetuer adipiscing elit。Ut eu metus id lectus vestibulum ultrices。Maecenas rhoncus。
前consectetuer
とすべてを削除したいelit
。
私の希望する出力:
consectetuer adipiscing elit.
これどうやってするの?
回答:
sedを使用します
sed 's/^.*\(consectetuer.*elit\).*$/\1/' file
sed s / find / replace /構文をデコードしました:
s/^.*
-行の先頭から始まる置換(^
)に続く任意の(.*
)...\(
-名前付きブロックを開始するconsectetuer.*elit\.
-最初の単語、.*
最後の単語(この場合、末尾の(エスケープされた)ドットを含む)までのすべてを一致させます\)
-指定されたブロックを終了する.*
(行末までを)$
)/
-代替検索セクションの終了\1
-間の名前のブロックと交換\(
し、\)
上記/
-交換を終了する^
か、$
sedのため、試してみて、最長一致を検索します。また、の後のドットを見逃している可能性があります。必要に応じてelit
挿入できます\.
。
^
で$
はないことを修正します-質問者が(元々)彼は少し初心者であり、これは他の文脈で役立つかもしれないと指摘したように、私はそれらをそこに残しました。
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番目$2
などです。
そのため、コマンドはconsectetuer
(.*consectetuer
)まですべてを照合し、次に()まですべてを照合し、次に行の最後までelit
(.*elit
)を照合.*
して、キャプチャしたパターンに置き換えます。
この質問のタイトルが「ファイルから」から「行から」に編集された理由はわかりませんが、OPは例が1行のみのように見えても、複数行にわたる可能性を除外しません。いずれにせよ、ここで複数行のソリューションを提供すると役立つ場合があります。
これはクロスラインで機能します:
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]$
参照:シェルパラメーターの展開
sed
です。perl
または、純粋なbash にすることもできます。