【问题标题】:grep with ^ (caret) doesn't work in the first line带有 ^ (插入符号)的 grep 在第一行不起作用
【发布时间】:2018-09-07 08:04:06
【问题描述】:

我想用 '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]

【问题讨论】:

  • 你不应该逃避第二个]吗?
  • 如果您将 BOM 匹配为可选序列怎么办? grep -E $'^(\xEF\xBB\xBF)?\[.*]$' file?
  • 第一种情况可能是第一行行尾有字符,试试cat -e test.ini
  • 使用grep -E $'^(\xEF\xBB\xBF)?\[.*]$' 效果很好,你能为我解释一下吗?
  • $> cat -e test.ini 显示M-oM-;M-?[isp_info]$

标签: regex utf-8 grep


【解决方案1】:

如果不介意第一个结果中包含的 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 '^\[.*]$'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多