带有^(脱字符号)的grep在第一行中不起作用

时间:2018-09-07 08:04:07

标签: regex utf-8 grep

我想用'grep'命令捕获所有部分。但是,我无法将表达式与第一行中的文件匹配,但在另一行中表现良好。我发现问题可能与文件类型有关,但是如果不允许修改文件类型,我不知道如何解决。我正在寻求解决方案。谢谢。

$> file test.ini
test.ini: UTF-8 Unicode (with BOM) text

$> cat test.ini
[isp_info]
reg_img_widthm1 = 100
[isp_blc0]
reg_blc_enable = 0
[isp_dpc0]
reg_dpc_enable = 0

$> grep '^\[.*]$' test.ini
[isp_blc0]
[isp_dpc0]

但是

$> file test.ini.ascii
test.ini.ascii: ASCII text

$> cat test.ini.ascii
[isp_info]
reg_img_widthm1 = 100
[isp_blc0]
reg_blc_enable = 0
[isp_dpc0]
reg_dpc_enable = 0

$> grep '^\[.*]$' test.ini.ascii
[isp_info]
[isp_blc0]
[isp_dpc0]

1 个答案:

答案 0 :(得分:4)

如果不介意第一个结果中包含BOM,则可以在正则表达式的开头添加可选的BOM模式:

grep -E $'^(\xEF\xBB\xBF)?\[.*]$' file

或符合BRE POSIX:

grep $'^\(\xEF\xBB\xBF\)\{0,1\}\[.*]$' file

模式详细信息

  • ^-字符串的开头
  • (\xEF\xBB\xBF)?(= {\(\xEF\xBB\xBF\)\{0,1\} BRE)-UTF8 BOM符号的可选序列
  • \[-一个[
  • .*-任意0个以上的字符
  • ]-一个]字符
  • $-行尾

或者,remove BOM并运行grep命令:

sed '1s/^\xEF\xBB\xBF//' file | grep '^\[.*]$'