Echo

Unix:如何從文件中讀取行的原始內容

  • August 19, 2013

我有一個數據文件,內容如下:

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

如何在不修剪所有冗餘空間的情況下閱讀該行?

當您擴展時,您正在失去空間$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          

正則表達式匹配

您還可以使用以下方法實現類似的功能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 正則表達式支持)。

這些解決方案與這些解決方案的主要區別cut在於它們基於模式進行匹配,其中cut解決方案對輸入數據採用更嚴格的結構(特定字元位置)。

靜態位置匹配

使用的替代方法cut是使用awk’ssubstr功能:

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

引用自:https://unix.stackexchange.com/questions/87210