Unix:ファイルから1行の生の内容を読み取る方法

Unix:ファイルから1行の生の内容を読み取る方法

次の内容のデータファイルがあります。

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ソリューションでは、最新バージョンにgrepPCRE(Perl Regular Expression Support)が含まれていると想定しています。

これらのソリューションと他のソリューションの主な違いは、ソリューションが入力データに対してより厳しい構造(特定の文字位置)を想定するパターンcutに基づいて一致することです。cut

静的位置マッチング

使用の別の代替方法は、s関数をcut使用することです。awksubstr

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | awk '{print substr($0,13,16)}'
done

関連情報