それが価値があることのために、私はそれを非常に頻繁に行う必要があり、の正確な使用方法を決して思い出せないwhile IFS= read...
ため、bashプロファイルで次の関数を定義しました。
# iterate the line of a file and call input function
iterlines() {
(( $# < 2 )) && { echo "Usage: iterlines <File> <Callback>"; return; }
local File=$1
local Func=$2
n=$(cat "$File" | wc -l)
for (( i=1; i<=n; i++ )); do
"$Func" "$(sed "${i}q;d" "$File")"
done
}
この関数は、最初にファイル内の行数を決定し、次にsed
行ごとに行を抽出するために使用し、各行を特定の関数に単一の文字列引数として渡します。大きなファイルではこれは非常に非効率になると思いますが、これはこれまでのところ問題ではありませんでした(もちろん、この歓迎を改善する方法に関する提案)。
使用方法はかなり甘いIMOです。
>> cat example.txt # note the use of spaces, whitespace, etc.
a/path
This is a sentence.
"wi\th quotes"
$End
>> iterlines example.txt echo # preserves quotes, $ and whitespace
a/path
This is a sentence.
"wi\th quotes"
$End
>> x() { echo "$#"; }; iterlines example.txt x # line always passed as single input string
1
1
1
1
1
<
ループ全体ができるとは知りませんでした。今では完全に理にかなっているが、私はそれを見た