LINUX.ORG.RU

Удаление многострочного совпадения - BASH

 


1

1

Просьба помочь с написанием bash скрипта для поиска и удалению фрагмента по совпадению. Ломал голову и sed и grep но многострочный текст не удаляется.

К примеру документ «А» содержит текст

-----start-----
MIIEQjCCAqqgAwIBAgIEXs+uFTANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMjcwMloXDTMw
MDUyNjEyMjcwMlowJzEVMBMGA1UEAwwMdXNlcjAyQGRpbV9hMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBANGitEuoK8LDefbS
QKN9sGE+TMqXumH639sGbSfCG7KcwiGkAHSz9wgNbSl67ZxN1SuaR44SCxxozKOn
SLTpn3drQMXEErfzj0/giGvfp0kD4SHL3Y7tcyrNPkRa8MN7RgSExis74+gozpQR
AgEAfVKNzCz+/OKUz6nZPtiY2MQMdq99jq1iPuhinJT9Y52Vf9EjOmt966b1s/dT
29pA5A4IgezhDUOuwCEAi9obH0tMt3MOLgsQ77ZLxP0T3KpRXKiGqWN6qobApwMz
E4Dh7H+rfPZenWZmZCH7Ufi/HNAasjce55moPRsc/+dx05rT21NkLDonXsVJGRWe
sMDGX705uFrooe/x6wHkmOZygo+sq53iEoxJaflBHRAGJNUzymh2uGgetQlmgIxe
1PrEIVpuEe4e69Z+DMAFOoZ00OWxYnMgMzsBL6YG1vcjaiOmBA7rIN3wWtokoK7a
2uiHM7eD7Nid4ddhamtAr5I5mwjiPfDQ9E5S0IsAUHbe/919RwIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFIAD1Ttr54eBtzh07dskVF7UEtVFMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQCe1gLI1BD8GhHP
+IcP8EpBZKMaJeF8oD19CsVsDrHpzpzeSHi7T5Oox4cXR0j/CnSrKQxzWDWG1Jx+
UVzbMMI2z70dsu9WcK+zgSTJ2NBXKyZ/fQU92XYrJVGh0SZNAgxh21FFJTayuHls
jk/0Gde2I/SrSe8gRCA1QQNFiUgEvZNGv4mty66fvEvQxs5uJZHmWNPvc/GWScIe
xrISKDC5QmZPGmIzbsudeBThcTy420L75rTfZcXfZQDSBO7VFv23xmHhPNDWObBA
/06b5TYMxze96UUJc1E/l+D734n9UU+zoxNRh9PNEgsDzY3GMq6s5cxa54ZzIRn/
F7ZSP57uQOTjtTDm1NeIK56vKuxQqmi1cAUbLPe0AjmDNyd6G9jMZf+QCZY8SWaq
32BWPWvI9WZ1V8hGI7yho5+RCfwo5d/2FBN1j4LMfuKMOPWV1XwwMabNLOtaTCkP
D/BqEGdzCeMegSazqAw0n5ZDXLbkn9B3qrxrw5HL6SXzAuWadCc=
-----end-----

И есть файл «Б» с содержимым где без пробелов есть «много похожего теста». Как сделать так чтоб присвоить содержимое документа «А» переменной, и найти полное совпадение в документе «Б» и вырезать его удалить пробелы.

Документ «Б» :

-----start-----
MIIEQjCCAqqgAwIBAgIEXs+uDDANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMjY1MloXDTMw
j0jhzmQVoNuXhDyn2vKAqA5U6WcnSbb7Nwlojt9fo0DApeelQBNHbBesUuhfDPMz
a9+lpspzzLtuVsStv+VHrbRcXp4Xl6TanHdxjTUV1UWjS9P+IdXFPmxdSfwEbb73
ylTq9UWKWa3rqSoF4UuQnlpEpqNNkfysV0LJ10vYVBOtG9OoPixqFwdqnAyNWn8y
unG40ObPJdSW99U8rINI3HTa9ksjeKkuc5BNh1vU9H6A8L5XzysVdn+ETrvi/Dye
b/wIBbPQY5r5EvxWPXJgPdVUoc7C+vJyfXBJglMd/iZ8ZjboUemUsjtyqu1sn+U5
TETo11fuiKcCMUwFc0rt+2CVxlIUu9x9wzN/L17VGIQHgMZR26I=
-----end-----
-----start-----
MIIEQjCCAqqgAwIBAgIEXs+vFjANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMzExOVoXDTMw
MDUyNjEyMzExOVowJzEVMBMGA1UEAwwMdXNlcjAxQGdhbF9iMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMNDMN0sTlqQqGAn
VpFOA/F7wgdmyZy3WSXnvYx/7hms1662N0bWPazlCPs4xolKNQPIbrClUur/B2zR
ixOcK43nmYHpZdhzlm2EMCVwKIHCgzF6xl7P+nbCJV5M9hFi65LJM5QbA44ZWwVk
f2ZsXt66lDlQHWZMsAhbqaCBV/STM85FuaJP/gCp+QR+hHbkXbRSlw9PbaAV3xKj
qwzaE59oJBiPtMKHX2R9eKpZ+D6LWOu4P7dyRbsyAli0RQvfIvIfKU3dt4DjkZ49
Tkuioe9cKJoMYTC+Fu1sqQcQYHpFgBEK/+cS4gKP7uQzirrVsGioi8K1O88Yu2es
-----end-----
-----start-----
MIIEQjCCAqqgAwIBAgIEXs+uFTANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMjcwMloXDTMw
MDUyNjEyMjcwMlowJzEVMBMGA1UEAwwMdXNlcjAyQGRpbV9hMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBANGitEuoK8LDefbS
QKN9sGE+TMqXumH639sGbSfCG7KcwiGkAHSz9wgNbSl67ZxN1SuaR44SCxxozKOn
SLTpn3drQMXEErfzj0/giGvfp0kD4SHL3Y7tcyrNPkRa8MN7RgSExis74+gozpQR
AgEAfVKNzCz+/OKUz6nZPtiY2MQMdq99jq1iPuhinJT9Y52Vf9EjOmt966b1s/dT
29pA5A4IgezhDUOuwCEAi9obH0tMt3MOLgsQ77ZLxP0T3KpRXKiGqWN6qobApwMz
E4Dh7H+rfPZenWZmZCH7Ufi/HNAasjce55moPRsc/+dx05rT21NkLDonXsVJGRWe
sMDGX705uFrooe/x6wHkmOZygo+sq53iEoxJaflBHRAGJNUzymh2uGgetQlmgIxe
1PrEIVpuEe4e69Z+DMAFOoZ00OWxYnMgMzsBL6YG1vcjaiOmBA7rIN3wWtokoK7a
2uiHM7eD7Nid4ddhamtAr5I5mwjiPfDQ9E5S0IsAUHbe/919RwIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFIAD1Ttr54eBtzh07dskVF7UEtVFMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQCe1gLI1BD8GhHP
+IcP8EpBZKMaJeF8oD19CsVsDrHpzpzeSHi7T5Oox4cXR0j/CnSrKQxzWDWG1Jx+
UVzbMMI2z70dsu9WcK+zgSTJ2NBXKyZ/fQU92XYrJVGh0SZNAgxh21FFJTayuHls
jk/0Gde2I/SrSe8gRCA1QQNFiUgEvZNGv4mty66fvEvQxs5uJZHmWNPvc/GWScIe
xrISKDC5QmZPGmIzbsudeBThcTy420L75rTfZcXfZQDSBO7VFv23xmHhPNDWObBA
/06b5TYMxze96UUJc1E/l+D734n9UU+zoxNRh9PNEgsDzY3GMq6s5cxa54ZzIRn/
F7ZSP57uQOTjtTDm1NeIK56vKuxQqmi1cAUbLPe0AjmDNyd6G9jMZf+QCZY8SWaq
32BWPWvI9WZ1V8hGI7yho5+RCfwo5d/2FBN1j4LMfuKMOPWV1XwwMabNLOtaTCkP
D/BqEGdzCeMegSazqAw0n5ZDXLbkn9B3qrxrw5HL6SXzAuWadCc=
-----end-----
-----start-----
MIIEQjCCAqqgAwIBAgIEXs+vFzANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMzExOVoXDTMw
MDUyNjEyMzExOVowJzEVMBMGA1UEAwwMdXNlcjAyQGdhbF9iMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBANXEsObDqdriaALB
Y1zVLLpfPc7wcbysuflmm8TKL3+j1dVXgYm/pJN6XizGo6ONevIKv72kHedCZYqx
z/DYHPuTip3xQRkkMFp879HdEzIj+RRMaZFVHqoPSI3sgS1flh9LtiVEjeHBZIDv
1Wg5SmYJa3HphRcJbNHfgXM6tUUyhcmlA8Bv9nsahKAIyNOdNdpWKfFzRYcDEOdg
V/10IB63dZkA2cxe3RQUJNJ2vomq8fcFYzz+wdKoCY5NmxLG0z8gZBBj5KimLLoT
LE1kxwRjxspQSWuXY/wBuOxvWDcTTyqpU6xuDkdgR2stIYMAsa6X93pCuoXPLo5m
qii+rAjIaOkqsgOrKgAsnJPpxg1FSVk4VVILn+B5lIU2jH5/ng57eQDZAOng2rPa
D+Kl2/phZpZTwbgxFoazMxHoUcmFw+R3EmGJEYwqtbYI6glyHW0oZb6+iyIjP/xb
-----end-----
-----start-----
MIIEQjCCAqqgAwIBAgIEXs+uFjANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMjcwM1oXDTMw
MDUyNjEyMjcwM1owJzEVMBMGA1UEAwwMdXNlcjAzQGRpbV9hMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAL4KUixf/wcI4fdT
6D5UtUBY11SGMUP5qXT8cD0qy2ddSBlwWU4PKMUl5/Cj7fDI5gl+s4f9YrxJzz64
IxrWVZIR8NH692nma19+o65qjf69IF7xPQjjQrUxcvHA2rWv4/pjb/s6ZPLpQaxI
K01/+D5PbsoecYpXQnbA458lAFHN1lUQL+E4xPXPushDTqMq0DcVGzkFnyoNhgzf
NYdQHuIoUIuLpH1seWSgW0pDEHokTye37qMksNkWviBZ29p2v3xdVK5Oek/jkeX/
2rzoNOZKp7SlTWKDcA9ePuI5vDuDtxLkKuuev3MgNTNS75/2nwOtIDfaZwuf7uJm
1oZPk7GTosiWouIKviz0Ei3vFQGhthMa6aaCgPrP3EgmeDzaQBZbpbcrdUAOdt1b
oJXlhHZ8jXZCpP0UOlFo/tHAPRpf3gGZ4VaggS5BBvvdHbuvnTTlX7/Js74KlL9A
/NWT4gbgdkTPhUExWsfb6VrCjJ/X7Pg/H8kTwPt9XDMgOLud/QIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFO1Pg7iB9oWH074Rhezvn0j12ktXMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQC4WlagnL0SWZhT
-----end-----

Новичек я, прошу сильно не пинать. Спасибо.

многострочного фрагмента

кажется сейчас будут бить за такую формулировку..

полное совпадение - это как?

вырезать в А или в Б?

какой критерий совпадения - одинаковая строка или просто любая последовательность символов? если последнее - то какая минимальная длина такой последовательности?

как идея - можешь построчно читать один файл, присваивать переменной строку, грепать этой строкой второй файл с получением номера строки и удалять из второго файла эту строку седом.

while read -r line; do

     todel=$(grep -n "$line" file2 | awk '{print $1}')
     
     for f in $todel; do
        sed -i "${f}d" file2
     done

done < file1

не проверял

nerve ★★ ()
Ответ на: комментарий от nerve

Вырезать из документа Б то что находится в А.

Разбить по строкам файл А и удалить совпадения в Б не пойдет. Так как в документе Б часто встречаются некоторые строки которые находят в А. Поэтому нужно найти полное совпадение с А в файле Б и удалить.

Второй день голову ломаю.

merdan ()

Минимальный пример покажи. Файл А, файл Б и какой файл результата надо из них получить. Эту простыню неприкольно смотреть. Любая такая задача может быть изложена на примере уровня «мама мыла раму» и решена.

legolegs ★★★★★ ()
Ответ на: комментарий от futurama

Файл А это сертификат клиента. Файл Б это файл revoked.pem куда в конец файла добавляется cert клиента и генерируется crl дабы запретить клиенту авторизацию на сервере для входа в корп сеть. Если вручную найти в revoked.pem сертификат клиента, удалить данный сертификат из него который начинается с start и заканчивается end и сгенирировать новый crl, то клиент которому был запрещен доступ ранее получает возможность подключаться к корп сети снова.

Пытаюсь написать скрипт восстановления подключения клиента который был отключен ранее.

Все остальное готово, только с этим проблема.

merdan ()
Ответ на: комментарий от merdan

А зачем добавлять в отдельный файл истекшие сертификаты, если их можно добавлять в отдельную папку и искать в той директории файл с пришедшим сертификатом на предмет наличия такого сертификата?

gedisdone ★★★ ()
Ответ на: комментарий от legolegs
----Старт---
Вася
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Олег
многострочный текст
многострочный текст
----Конец-----

Найти в нижнем полное соответствие и удалить не оставляя пробелов.

----Старт---
Вася
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Андрей
многострочный текст
многострочный текст
----Конец-----
----Старт---
Вася
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Олег
многострочный текст
многострочный текст
----Конец-----
----Старт---
Катя
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Андрей
многострочный текст
многострочный текст
----Конец-----
и еще миллион разных комбинаций

merdan ()
Ответ на: комментарий от gedisdone

При перемещении истекшего сертификата в другую папку и если сертификат не добавить в файл revoked и не сгенирировать файл crl из сертификата сервера+файла revoked то клиент продолжает успешно подключаться к сети. Выход только удалить из файла revoked сертификат клиента и сгенирировать заново crl

merdan ()
Ответ на: комментарий от nerve

В последних обновах опен чето то намудрил с сертификатами. Возврат не получается. И наш DPI щелкает опенвпн как семечки и помещает сервер в бан список. Это не опенвпн. Смотрел примеры разные, никак не смог найти что то похожее чтоб подглядеть для своего скрипта. Никак не получается сделать механизм возврата, все упирается в это.

merdan ()
Ответ на: комментарий от merdan

Ну например так:

<B awk -vRS='----Старт---' -vORS='' -vNEEDLE="$(<A)"$'\n' 'NR>1 && ($0=RS$0) && ($0!=NEEDLE)'

выхлоп

----Старт---
Вася
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Андрей
многострочный текст
многострочный текст
----Конец-----
----Старт---
Катя
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Андрей
многострочный текст
многострочный текст
----Конец-----
и еще миллион разных комбинаций

уродливенько, но вроде работает как ты запрашивал. С \n в конце файла могут быть трудности. Прикручивать очищалку мне лень.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 2)
Ответ на: комментарий от anonymous

Я то за надежность. Но если даже в данный момент на опене использовать TLS1.3 дпи его находит. Так что я лично ушел к своим не большим нароботкам так сказать, с которыми в качестве эксперимента игрался когда еще опен работал. Он выжил когда опен начал падать сразу после создания.

merdan ()
Ответ на: комментарий от legolegs

<B awk -vRS=‘—-Старт—’ -vORS='' -vNEEDLE=«$(<A)»$‘\n’ ‘NR>1 && ($0=RS$0) && ($0!=NEEDLE)’

Объясните пожалуйста что есть что тут. (ибо новичок в линуксе)

Первая B это файл в котором нужно искать. ‘—-Старт—’ - это начало сертификата которое в оригинале —–BEGIN CERTIFICATE—–, -vNEEDLE=«$(<A)»$ тут А это файл А про который я говорил?

merdan ()
Ответ на: комментарий от merdan

Это не bash, это AWK.

И это достаточно объёмистый язык, который придётся учить для эффективной работы с ним. Как и bash — оба они по сегодняшним меркам кривоватые, угловатые, неудобные и неочевидные. И требуют загрузить весь этот набор угловатостей и неочевидностей в башку.

И это не хорошо и не плохо, просто эти языки разрабатывались почти полвека тому назад и их дизайн продиктован ограничениями железа тех времён и состоянием тогдашней computer science.

Если не стоит цель стать гуру-админом и «чтобы работало на любой unix-машине», а просто иногда поковырять текст или попарсить файлики — лучше взять любой современный скриптовый язык: Python, Ruby, JS, Lua. И разобраться с регулярками. У каждого из вышеперечисленных — своих угловатостей хватает. Но нагуглить готовое решение, или даже накидать своё из готовых модулей получится куда проще и быстрее.

anonymous ()
Ответ на: комментарий от anonymous
  • или даже накидать своё из готовых модулей получится куда проще и быстрее.

Поэтому и спросил тут на форуме, как быстро решить эту проблему с возвратом. Собрал все на других примерах + добавив свои решения. Не удается только удалить искомый текст из второго документа. А пока курю форумы и читаю.

merdan ()
Ответ на: комментарий от merdan

Объясняю. Здесь одновременно используются bash и awk. Важно понять где что.

В команде

<B awk -vRS='----Старт---' -vORS='' -vNEEDLE="$(<A)"$'\n' 'NR>1 && ($0=RS$0) && ($0!=NEEDLE)'

<B - подать файл B на стандартный ввод программы. Я обычно это пишу в начале или в конце команды, хотя в шелле (оболочке, sh/bash) разрешено делать это в любом месте строки вне кавычек. В нашем случае в конце можно ещё дописать >Bnew.

awk - интерпретатор языка AWK. Я привык пользоваться его gnu-версией gawk, на BSD и macos её приходится ставить отдельно. Далее идут 4 аргумента.

-vПЕРЕМЕННАЯ=ЗНАЧЕНИЕ установить переменную AWK заранее. Кавычки вокруг ЗНАЧЕНИЕ нужны для оболочки (bash) чтобы она ничего не попортила и для читаемости. bash их уберёт перед отправкой в awk.

RS - служебная переменная разделитель записей при вводе (record separator). Обычно в AWK разделитель записей — перевод строки, но тут нам нужно другое.

ORS - служебная переменная разделитель записей при выводе (output record separator). Мы его убираем.

NEEDLE - наша переменная для поиска и изъятия.

"$(<ИМЯ ФАЙЛА)" вставит содержимое файла в командную строку, откусив завершающий перевод строки. Можно было бы сделать вручную

awk ... -vNEEDLE="----Старт---
Вася
многострочный текст
многострочный текст
многострочный текст
Аня
многострочный текст
многострочный текст
Олег
многострочный текст
многострочный текст
----Конец-----"

— да, так и вбить в консоль, с переводами строк внутри кавычек. Так можно. Но тут не нужно.

$'\n' - в bash есть три типа кавычек:

  1. 'ничего не делающие',
  2. "раскрывающие $ПЕРЕМЕННЫЕ и делающие другие трюки"
  3. малоизвестный синтаксис $'раскрывающие \n \t и всякое прочее \342\230\242' как принято в языке Си. Мы здесь возвращаем на место перевод строки, который был вероломно откушен операцией $()

Четвёртым и последним аргументом в одинарных кавычках идёт текст программы на языке AWK.

Программа на AWK состоит из пар условие-действие. Каждая запись в файле (разделённая RS) считывается интерпретатором и проверяется на соответствие всем условиям по порядку. Если условие истинно, то выполняется действие. Если действие не указано (как у нас), то выполняется печать записи.

Наше условие одно и оно таково: NR>1 && ($0=RS$0) && ($0!=NEEDLE). Оно

  1. проверяет что запись не первая (первая запись получается пустая, ведь с разделителя ----Старт--- файл начинается)

  2. модифицирует обрабатываемую запись $0, явно дописывая разделитель в её начало. Этот $ - авковский, не шелловский. Операция конкатенации строк в AWK выглядит никак. (Оператор + нужен только числам) Этот элемент логического выражения всегда истинен.

  3. проверяет, что наша запись целиком не совпадает с искомой строкой NEEDLE.

Если все три подусловия верны (.. && .. && ..), то запись будет напечатана на стандартный вывод и AWK перейдёт к следующей в файле записи и к началу программы.

legolegs ★★★★★ ()

Делай сплит документа Б по маркерам —–(start|end)—–

Сравнивай пофайлово А с каждым из Б1, Б2, …, Бn

При нахождении совпадения удаляй из Б фрагмент, соответствующий номеру совпавшего Бi

anonymous ()

На самом деле приведенные тобой данные (SSL сертификат или какой-то похожий на него блок данных) являются одной строкой, автоматически разбитой на части для удобства копирования.
При расшифровке такое обычно сначала сшивается обратно в одну строку.

А вот какой смысл искать там какие-то совпадающие фрагменты - я не понимаю.
Может нужно полностью выкусывать из текста любые подобные блоки или какие-то конкретные?

blexey ★★★★★ ()
Ответ на: комментарий от legolegs

Есть файл «А» с тем что нужно искать и вырезать в «Б». В файле «Б» не происходит изменений. Пробовал дописывать как и советовали Бnew. Появляется новый текстовой файл Бnew идентичный файлу Б. Написал

<B.txt awk -vRS='-----BEGIN CERTIFICATE-----' -vORS='' -vNEEDLE="$(<A.txt)"$'\n' 'NR>1 && ($0=RS$0) && ($0!=NEEDLE)' >Bnew.txt

Не нашел как прикрепить вложение в виде текстового документа. Текстовой документ А

-----BEGIN CERTIFICATE-----
MIIEQjCCAqqgAwIBAgIEXs+vFjANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMzExOVoXDTMw
MDUyNjEyMzExOVowJzEVMBMGA1UEAwwMdXNlcjAxQGdhbF9iMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMNDMN0sTlqQqGAn
VpFOA/F7wgdmyZy3WSXnvYx/7hms1662N0bWPazlCPs4xolKNQPIbrClUur/B2zR
ixOcK43nmYHpZdhzlm2EMCVwKIHCgzF6xl7P+nbCJV5M9hFi65LJM5QbA44ZWwVk
f2ZsXt66lDlQHWZMsAhbqaCBV/STM85FuaJP/gCp+QR+hHbkXbRSlw9PbaAV3xKj
qwzaE59oJBiPtMKHX2R9eKpZ+D6LWOu4P7dyRbsyAli0RQvfIvIfKU3dt4DjkZ49
Tkuioe9cKJoMYTC+Fu1sqQcQYHpFgBEK/+cS4gKP7uQzirrVsGioi8K1O88Yu2es
1Tymo3ZjVp7tqL1DYadpK/kWI0HiTDKajmh13Qxm6F4iSoUuj5aSyuGcKuI5B29p
7KPNEQ3pmZ47PSUfJfHcjDOigVN7NKeLKdasTQ+Yj/q9kK9QvXudiUx2h7FzBQAY
xeG1WrnpMNJxEdFOhUPK7FfmvfT729CH+JKBGxK4oMrNPCYaqwIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFANsyxDMA5w7q3xyim1O/91nPrCAMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQCzxYv3TbwxOAxQ
GgLmOVz+zWi9MMtCR1O+o93XXgU191thDTXKl3nwakcMDWUO2rMKlPPpiGtrPlM0
nkZVlcQ7iUWly2Qt0GbM9bHS3U+4wRefPGm7ssHwqqV9mPvL76p1xFcgdL+EDrOg
pMMbqmrLamWD4sC6tZ1wxh9gRACmO2l4GQL0Dqd6E6//u6fixY7mYCLVOnOiHg5r
YlzVoGncGRObwg3kr34C71Dkra9XpB7LOZvMnSEBLTuIhIeQneL0lbWKEyi9ExTD
RDqwRSm29HNh9vh6tiFu6fGjGdOaWZ3YIZ/ZGSNuJt2ghKv5/nVEIBq5CfYxHswh
N90sau38Bi3Biw1UKmHSlGivwrjiF+kTNrK2oYr0jLsSfsZejsrVIMcqLNby1niK
EQWQqz8x3tlSfZP4HPL88fTfp9OYVYGiaqhQiVecqe2EIlqrfHqXinOwwB6oMI1f
qcFL3lXbIbco2+GJvjJWcPZVgdHtV6CKs2Gt2v5D+i0SJ8ezjnQ=
-----END CERTIFICATE-----

Файл «Б» : Второй блок которого равен файлу «А».

-----BEGIN CERTIFICATE-----
MIIEQjCCAqqgAwIBAgIEXs+uDDANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMjY1MloXDTMw
MDUyNjEyMjY1MlowJzEVMBMGA1UEAwwMdXNlcjAxQGRpbV9hMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM5aoY4FjGzTeb/g
e9vcWG7IDcKd6p1dzM0QQujerI4raFHTdSelrpEcW2zRWGqKlIS5LGNfPYZegixG
VJX+ib1lLWN4yjyTl09lvrM1lfewW1luDno4daCHrLSXMTsPHmT6nP33Ju2K2n+l
cI4XGOYn6P7w79toqjtuTZ9YevT3Y2UsfhL6Q+7lw/4ym3yq69R1TMkJyOo+cQ7D
QUeauwpcSu+bvVXfraRMwHmNEfp56dyVsNxGduTzVYrtEIrfT5czoMZsDHLg09Qr
o03GzkeSQKH1muOKRk2nF+PPsGRbckxsgSjd3rscW6d7iK/3a7EgEPMwI4rYtaa9
yrBn0RWWKJjhfyvAnOUNWZ3aI+dVtS40mrKjwYqr141QZW5zrXFikNNlWRbc9l1r
6g5FPi96QZlhv1JsI17lHqRQWwE6vJtJaqIc1k0zWk2YtEdF7I1elJ8jFKIXKWu1
EotntJuVbSd/Fnw6oE9hWAvyQkj3mr6ST+R/Wkhigr8M/2Ce6QIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFKcldR87+LT2lRfpj9o8I1xN/6tAMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQBmxMAlJSlQHWAG
QK+h/QyZduHdgEp8MA5KTzhNd/KuPXKhfD5JfG7lITgflHIhG3QOi2zoeWNguiXl
BL1In3uGDQQyg2QNNgk351KzdsktvPMhZ1Lo+Z/cY7w9B433ZniR72qlBJKT6wBo
j0jhzmQVoNuXhDyn2vKAqA5U6WcnSbb7Nwlojt9fo0DApeelQBNHbBesUuhfDPMz
a9+lpspzzLtuVsStv+VHrbRcXp4Xl6TanHdxjTUV1UWjS9P+IdXFPmxdSfwEbb73
ylTq9UWKWa3rqSoF4UuQnlpEpqNNkfysV0LJ10vYVBOtG9OoPixqFwdqnAyNWn8y
unG40ObPJdSW99U8rINI3HTa9ksjeKkuc5BNh1vU9H6A8L5XzysVdn+ETrvi/Dye
b/wIBbPQY5r5EvxWPXJgPdVUoc7C+vJyfXBJglMd/iZ8ZjboUemUsjtyqu1sn+U5
TETo11fuiKcCMUwFc0rt+2CVxlIUu9x9wzN/L17VGIQHgMZR26I=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEQjCCAqqgAwIBAgIEXs+vFjANBgkqhkiG9w0BAQsFADAnMREwDwYDVQQDEwhW
UE4gQXNpYTESMBAGA1UEChMJSXdhbiBDb3JwMB4XDTIwMDUyODEyMzExOVoXDTMw
MDUyNjEyMzExOVowJzEVMBMGA1UEAwwMdXNlcjAxQGdhbF9iMQ4wDAYDVQQLEwV1
c2VyczCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMNDMN0sTlqQqGAn
VpFOA/F7wgdmyZy3WSXnvYx/7hms1662N0bWPazlCPs4xolKNQPIbrClUur/B2zR
ixOcK43nmYHpZdhzlm2EMCVwKIHCgzF6xl7P+nbCJV5M9hFi65LJM5QbA44ZWwVk
f2ZsXt66lDlQHWZMsAhbqaCBV/STM85FuaJP/gCp+QR+hHbkXbRSlw9PbaAV3xKj
qwzaE59oJBiPtMKHX2R9eKpZ+D6LWOu4P7dyRbsyAli0RQvfIvIfKU3dt4DjkZ49
Tkuioe9cKJoMYTC+Fu1sqQcQYHpFgBEK/+cS4gKP7uQzirrVsGioi8K1O88Yu2es
1Tymo3ZjVp7tqL1DYadpK/kWI0HiTDKajmh13Qxm6F4iSoUuj5aSyuGcKuI5B29p
7KPNEQ3pmZ47PSUfJfHcjDOigVN7NKeLKdasTQ+Yj/q9kK9QvXudiUx2h7FzBQAY
xeG1WrnpMNJxEdFOhUPK7FfmvfT729CH+JKBGxK4oMrNPCYaqwIDAQABo3YwdDAM
BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
gAAwHQYDVR0OBBYEFANsyxDMA5w7q3xyim1O/91nPrCAMB8GA1UdIwQYMBaAFCc/
hAJ5XgtZ1ROCo3H9f8BBm5+cMA0GCSqGSIb3DQEBCwUAA4IBgQCzxYv3TbwxOAxQ
GgLmOVz+zWi9MMtCR1O+o93XXgU191thDTXKl3nwakcMDWUO2rMKlPPpiGtrPlM0
nkZVlcQ7iUWly2Qt0GbM9bHS3U+4wRefPGm7ssHwqqV9mPvL76p1xFcgdL+EDrOg
pMMbqmrLamWD4sC6tZ1wxh9gRACmO2l4GQL0Dqd6E6//u6fixY7mYCLVOnOiHg5r
YlzVoGncGRObwg3kr34C71Dkra9XpB7LOZvMnSEBLTuIhIeQneL0lbWKEyi9ExTD
RDqwRSm29HNh9vh6tiFu6fGjGdOaWZ3YIZ/ZGSNuJt2ghKv5/nVEIBq5CfYxHswh
N90sau38Bi3Biw1UKmHSlGivwrjiF+kTNrK2oYr0jLsSfsZejsrVIMcqLNby1niK
EQWQqz8x3tlSfZP4HPL88fTfp9OYVYGiaqhQiVecqe2EIlqrfHqXinOwwB6oMI1f
qcFL3lXbIbco2+GJvjJWcPZVgdHtV6CKs2Gt2v5D+i0SJ8ezjnQ=
-----END CERTIFICATE-----

Почему то не происходит изменений ни в файле «Б» ни в новом создаваемом файле Bnew.txt. А нужно чтоб удалилось в «Б» все что есть в «А». Извините за доставляемую головную боль. В чем ошибся то я?

merdan ()
Ответ на: комментарий от merdan

Возможно, дело в том, что в конце B.txt нет перевода строки. Моему скрипту он требуется, и вообще многие юниксовые утилиты по старому соглашению его требуют и оставляют.

legolegs ★★★★★ ()
Ответ на: комментарий от anonymous

Все что хочешь, даже драйвер.

Я бы хотел зарабатывать написанием на луа. Я беден в настоящее время :( А за драйвер мне не денег дадут, а 3,14зды в очередной раз :(

Владимир

anonymous ()