次の範囲を考慮してください。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
好みます。-r
sed
grep
POSIX/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}'