
ファイルから行を印刷する次の方法が見つかりました。
この例では、ホストファイルの最初の行を印刷しようとしています。
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 9
q
他の答えが示唆したように、変数パラメータを処理することは、シェルがパラメータを拡張できるようにするのと同じくらい簡単です。したがって、これを行うには "$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
スクリプトでなければならず、区切り文字を含めることはできません。