特定のシェルスクリプトの `sed` 使用法の説明

特定のシェルスクリプトの `sed` 使用法の説明

読みながらオンラインチュートリアル、次のコードが見つかりました。

#!/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

おすすめ記事