読みながらオンラインチュートリアル、次のコードが見つかりました。
#!/bin/bash
# Counting the number of lines in a list of files
# for loop over arguments
# count only those files I am owner of
if [ $# -lt 1 ]
then
echo "Usage: $0 file ..."
exit 1
fi
echo "$0 counts the lines of code"
l=0
n=0
s=0
for f in $*
do
if [ -O $f ] # checks whether file owner is running the script
then
l=`wc -l $f | sed 's/^\([0-9]*\).*$/\1/'`
echo "$f: $l"
n=$[ $n + 1 ]
s=$[ $s + $l ]
else
continue
fi
done
echo "$n files in total, with $s lines in total"
sed
この例では、呼び出しの目的は何ですか?
ベストアンサー1
例6のコマンドは、sed
出力から行数のみを抽出しますwc -l
。
実行中ですwc -l
($f
引数として渡されたスクリプトが所有するファイル)。通常、次のような出力が生成されます。
$ wc -l .bashrc
17 .bashrc
1列の行数と2列のファイル名。このsed
コマンドは非常に不要な方法で行数だけを取得します。
$ wc -l .bashrc | sed 's/^\([0-9]*\).*$/\1/'
17
このsed
ステートメントは's/^\([0-9]*\).*$/\1/'
次のことを行います。
^
- 行の先頭に一致します。\([0-9]*\)
- 数字を無制限に一致させます(角かっこをエスケープするとキャプチャグループが形成されます)。.*
- 何でも無制限に一致$
- 行末の一致\1
- 最初のキャプチャグループの内容を示します。
デフォルトでは、これは数字で始まるすべての行と一致し、行全体を最初のキャプチャグループ(番号)に置き換えます。
これを推薦してくれたStephen Kittに感謝します。
$ wc -l < .bashrc
17
それ以外の場合は、以下のようにcut
使用する方が良いです。awk
$ wc -l .bashrc | cut -d' ' -f1
17
$ wc -l .bashrc | awk '{print $1}'
17