Unix:如何从文件中读取行的原始内容

Unix:如何从文件中读取行的原始内容

我有一个数据文件,内容如下:

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 正则表达式支持)。

这些解决方案与其他解决方案的主要区别cut在于,它们基于模式进行匹配,其中cut解决方案对输入数据假设更严格的结构(特定字符位置)。

静态位置匹配

using 的另一种选择cut是使用awkssubstr函数:

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

相关内容