sed範囲が常に1行だけ一致できるわけではありません。

sed範囲が常に1行だけ一致できるわけではありません。

次の範囲を考慮してください。1,/pattern/最初の行でパターンが一致すると、範囲はファイル全体と一致します。

$ cat 1.sh
#!/usr/bin/env bash
set -eu
seq 1 4 | sed -rn '1,/'"$1"'/p'
$ ./1.sh 1
1
2
3
4
$ ./1.sh 2
1
2

あなたは何をしますか?

UPD私がしたことは次のとおりです。

re='/1/'
seq 1 4 | sed -rn "1{$re{p;q}}; 1,${re}p"

またはこれ:

seq 1 4 | sed -rn "1{/1/{p;q}}; 1,//p"

ベストアンサー1

うん、迷惑なことだsed(見てsedよくある質問約このポイント)。 GNU sed(GNU固有)を使用しているので、-r次のことができます。

 sed -En "0,/$1/p"

(私はFreeBSDのような他のツールでもサポートされ、一貫性があるので-E好みます。-rsedgrepPOSIX/Single UNIX 仕様標準の次号)).

より良い代替(および移植可能)は次のとおりです。

sed "/$1/q"

sed最初のゲームが終了したら、終了(そして読み取りを停止)するように指示します。

問題がないので、awk次のように書くことができます。

PATTERN=$1 awk 'NR==1, $0 ~ ENVIRON["PATTERN"]'

(forに似ていますが、sed作成することをお勧めします):

PATTERN=$1 awk '1; $0 ~ ENVIRON["PATTERN"] {exit}'

おすすめ記事