Sed +テキストファイルの行を表示するためにsedコマンドでパラメータを設定する方法

Sed +テキストファイルの行を表示するためにsedコマンドでパラメータを設定する方法

ファイルから行を印刷する次の方法が見つかりました。

この例では、ホストファイルの最初の行を印刷しようとしています。

sed -n '1,1p'  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

しかし、sedコマンドのパラメータを使用して同じ操作を実行する方法

例えば

Line_number=1
sed -n ' $Line_number,$Line_numberp'  /etc/hosts
 sed: -e expression #1, char 4: extra characters after command

私のsed構文にはどんな問題がありますか?

答え1

変数を拡張するには、シェルの「代わりに」を使用します。

例:

victor@pyfg:~$ line_number=2
victor@pyfg:~$ sed -n "${line_number},${line_number}p" /etc/hosts
1.2.3.4 row-2

1行だけ印刷するので、次のように印刷することもできます。

victor@pyfg:~$ sed -n "${line_number}p" /etc/hosts
1.2.3.4 row-2

答え2

楽しみのためのawkソリューション:

awk -v line=2 'FNR==line' /etc/hosts

答え3

qあなたの例では、目的のデータが印刷されたことを確認した後、sed uitを使用してファイルを入力することをお勧めします。たとえば、

sed 1q <INPUT

これにより、自動的に最初の行が印刷され、プロセスが完全に終了します。次のようにすることもできます。

head -n1 <INPUT

...同じ効果を得るために。

sedただし、解釈することも、2種類の組み合わせにすることもaddress,rangesできます。/regex/,/addresses/たとえば、

sed '9q;/LINE[0-9]/,/^$/!d' <<FILE
$(printf 'LINE %s\nLINE%s\nLINE %s\\nNOT LINE %s\n\n' $(seq 32))
FILE

###OUTPUT###

LINE2
LINE 3\nNOT LINE 4

LINE6
LINE 7\nNOT LINE 8

LINE 9

上記の例では、文字列またはその直後の数字を含む行と、文字がまったく含まれていない行または空白行の間にないすべての行がsed d削除されます。!したがって、ライン1と5 - またはが出力から削除されます。代わりに9で表示されるため、その時点でスクリプトの処理を停止します。これは、フィルタがスクリプトを削除する前に発生するため、印刷されます。LINE[0-9]/^$/LINE [15]LINE 9q

他の答えが示唆したように、変数パラメータを処理することは、シェルがパラメータを拡張できるようにするのと同じくらい簡単です。したがって、これを行うには "$parameter"を使用する必要があります。間違った入力は間違った入力として扱われることを覚えておくことが重要です。たとえば、同じ理由で:

echo "///" | sed 's////g'     
sed: -e expression #1, char 5: unknown option to `s'

...でもない:

v=/ ;echo "///" | sed "s/$v//g"                                 :(
sed: -e expression #1, char 5: unknown option to `s'

各変数の値は有効なsedスクリプトでなければならず、区切り文字を含めることはできません。

関連情報