Как мне сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10? Я в тупике, потому что Solaris не поставляется с GNU sed. Дано следующее содержимое файла:
LinearFile(3F007F106F3B, FDN, 29, 20)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, 12345)
}
LinearFile(3F007F106F3C, SMS, 176, 20)
LinearFile(3F007F106F4F, ECCP, 15, 10)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
}
LinearFile(3F007F106F42, SMSP, 43, 3)
BinaryFile(3F007F106F43, SMSS, 2)
LinearRec(1, 12345)
Я хотел бы удалить блок, содержащий:
{
LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
}
Файл будет выглядеть так:
LinearFile(3F007F106F3B, FDN, 29, 20)
LinearFile(3F007F106F40, XXX, 29, 1)
{
LinearRec(1, 12345)
}
LinearFile(3F007F106F3C, SMS, 176, 20)
LinearFile(3F007F106F4F, ECCP, 15, 10)
LinearFile(3F007F106F40, XXX, 29, 1)
LinearFile(3F007F106F42, SMSP, 43, 3)
BinaryFile(3F007F106F43, SMSS, 2)
LinearRec(1, 12345)
Чтобы удалить следующую строку, я выполнил следующее:
sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt
А как насчет строки, которая совпадает с предыдущей строкой?
Может быть, этого можно добиться с помощью ed или vi? Спасибо!
решение1
Вот ed
сценарий:
ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!
Он записывает вывод в файл newfile.txt
.
«Глобальная» повторяющаяся версия этого —
ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!
решение2
Подход perl
(предполагается, что ваш файл достаточно мал для загрузки в память):
perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file
Заставляет -0
slurp perl
весь файл, а -p
сообщает ему, что нужно выводить каждую входную строку после применения скрипта, заданного -e
. Сам скрипт сопоставляет 58 F
s и окружающие их две строки и удаляет их.
решение3
sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out
Это обеспечивает sed
просмотр на одну строку вперед, а затем P
выводит только те строки, которые не соответствуют вашей серии, поскольку он переходит еще на одну строку и сбрасывает буфер, когда совпадает с первыми двумя строками.