Я хотел бы захватить всю часть раздела с помощью команды 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]
Что, если вы сопоставите спецификацию как необязательную последовательность? grep -E $'^(\xEF\xBB\xBF)?\[.*]$' file
?
могут быть символы в конце первой строки для первого случая, попробуйте cat -e test.ini
он хорошо работает с grep -E $'^(\xEF\xBB\xBF)?\[.*]$'
, не могли бы вы мне это объяснить?
$> cat -e test.ini
показывает M-oM-;M-?[isp_info]$
Если вы не возражаете против спецификации, включенной в первый результат, вы можете добавить необязательный шаблон спецификации в начале регулярного выражения:
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\[
- [
.*
- любые символы 0+]
- символ ]
$
- конец строкиВ качестве альтернативы, удалить спецификацию и запустите вашу команду grep
:
sed '1s/^\xEF\xBB\xBF//' file | grep '^\[.*]$'
не следует ли вам избегать второго
]
?