我想用'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]
答案 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 '^\[.*]$'