次の内容のデータファイルがあります。
department: customer service section: A
department: marketing section: A
department: finance section: A
各行を読みながらコマンドを使用して部門名を抽出しますcut
。残念ながら、プログラムはtrim
不要なスペースをすべて自動的に削除するので、誤って部門名を切りました。
cat dept.dat | while read line
do
echo $line
echo $line | cut -c 12-29
done
たとえば、元の行は次のようになります。
department: marketing section: A
プログラムはこの行を次のように処理します。
department: marketing section: A
不要なスペースをすべて切り取ることなく、どのように行を読むことができますか?
答え1
拡張するとスペースが失われます$line
。変数拡張の周りに二重引用符を入れると、空白が保持されます。
$ cat dept.dat | while read line
> do
> echo "$line"
> echo "$line" | cut -c 12-29"
> done
department: customer service section: A
customer service
department: marketing section: A
marketing
department: finance section: A
finance
答え2
正規表現の一致
以下を使用して同様の効果を得ることもできますsed
。
$ cat dept.dat | while read line
do
echo "$line"
echo "$line" | sed -e 's/.*: \(.*\) .*/\1/'
done
以下も使用できますawk
。
$ cat dept.dat | while read line
do
echo "$line"
echo "$line" | awk '{sub(/.*nt: /,""); sub(/ .*/,""); print }'
done
以下も使用できますgrep
。
$ cat dept.dat | while read line
do
echo "$line"
echo "$line" | grep -oP '(?<=: ).*(?= )'
done
メモ:このgrep
ソリューションでは、最新バージョンにgrep
PCRE(Perl Regular Expression Support)が含まれていると想定しています。
これらのソリューションと他のソリューションの主な違いは、ソリューションが入力データに対してより厳しい構造(特定の文字位置)を想定するパターンcut
に基づいて一致することです。cut
静的位置マッチング
使用の別の代替方法は、s関数をcut
使用することです。awk
substr
$ cat dept.dat | while read line
do
echo "$line"
echo "$line" | awk '{print substr($0,13,16)}'
done