次のように.bashrcファイルにエイリアスを追加しようとしています。
...
alias cutf="_cutf"
...
_cutf() {
awk 'NR >= $2 && NR <= $3 { print }' < $1
}
(この関数の目的は、$ 1ファイル内の$ 2と$ 3の間に番号が付けられた行の内容を表示することです。)
新しいbashセッションでcutfを呼び出すと、出力は出ません。
私は何を逃したことがありませんか?
答え1
$ 2と$ 3は一重引用符で囲まれています。シェルは一重引用符で囲まれた変数を拡張しないため、からawk
二重引用符に変換されます。
awk "NR >= $2 && NR <= $3 { print }" < "$1"
以下を使用して同じ結果を得ることができます。
sed -n 'X,Yp' file
ここで、XとYは行番号、またはPerlでも同様です。
perl -ne 'print if X .. Y' file
どちらも短く、おそらくその機能は必要ありません。
答え2
awkステートメントでシェルに変数を拡張させることはできません。 $2 や $3 などの変数は awk に特別な意味を持ちます。
_cutf() {
awk -v start="$2" -v stop="$3" 'NR >= start && NR <= stop { print }' "$1"
}
それともこれを書くことができます
_cutf() {
awk 'NR >= start && NR <= stop { print }' start="$2" stop="$3" "$1"
}