2015-01-28 5 views
0

Я столкнулся с странной проблемой. Я хочу извлечь содержимое между двумя строками. Структура файла почти такая же, но она отличается по размеру. Команды, которые я использую, хорошо работают с одним файлом temp, но не с другим файлом tmp2.выпуск с командой sed

-bash-3.2# cat temp 
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><dp:response xmlns:dp="http://www.datapower.com/schemas/management"><dp:timestamp>2015-01-22T13:38:04Z</dp:timestamp><dp:file name="temporary://test.txt">XJzLXJlc3VsdHMtYWN0aW9uX18i</dp:file><dp:file name="temporary://test1.txt">lc3VsdHMtYWN0aW9uX18i</dp:file></dp:response></env:Body></env:Envelope> 

Ниже команд производят ожидается выход

-bash-3.2# sed -n 's_<env:Envelope\(.*\)<dp:file name="temporary://test.txt">\([^>]*\)</dp:file>\(.*\)_\2_p' temp 

XJzLXJlc3VsdHMtYWN0aW9uX18i 

-bash-3.2# sed -n 's_<env:Envelope\(.*\)<dp:file name="temporary://test1.txt">\([^>]*\)</dp:file>\(.*\)_\2_p' temp 

lc3VsdHMtYWN0aW9uX18i 

-bash-3.2# cat tmp2 
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><dp:response xmlns:dp="http://www.datapower.com/schemas/management"><dp:timestamp>2015-01- 
27T11:10:38Z</dp:timestamp><dp:file name="temporary://BackUpDir/backupmanifest.xml">PFNlY3VyZUJhY2t1cE1hbmlmZXN0Pg0KPGJhY2t1cG1hbmlmZXN0Pg0KIDx2ZXJzaW9uPlhJNTAuNi4wLjAu 
MTwvdmVyc2lvbj4NCiA8dGltZXpvbmU+R01UMEJTVDwvdGltZXpvbmU+DQogPGNvbmZpZz5hdXRvY29uZmlnLmNmZzwvY29uZmlnPg0KIDx0aW1lPjIwMTUtMDEtMjdUMTE6MDI6NTZaPC90aW1lPg0KIDxidWlsZD4yMzI3 
Nzc8L2J1aWxkPg0KIDxidWlsZGRhdGU+MjAxMy8wOC8wMSAxOTo0MzozNjwvYnVpbGRkYXRlPg0KIDxjb21tb25jcml0ZXJpYT5vZmY8L2NvbW1vbmNyaXRlcmlhPg0KIDxzZXJpYWxudW1iZXI+NjhBNTkyNjwvc2VyaWFs 
bnVtYmVyPg0KIDxjcnlwdG9DZXJ0aWZpY2F0ZT5zZWN1cmVfYmFja3VwPEZpbGVOYW1lPmNlcnQ6Ly8vc2VjdXJlX2JhY2t1cC1zc2NlcnQucGVtPC9GaWxlTmFtZT48L2NyeXB0b0NlcnRpZmljYXRlPg0KIDxlcGhlbWVy 
Ukhwc3Bxb0V0YlU0SDBtOVkNCkJzVHEwRFhiTUk4WGNMc1NiUGc5WktRdlBzY2Y5Q0sxRDhwdUJjODM0akNOaDJCQnhlWWdMTzhnUWg5NXVjNHENCjVtMTlWNnhNYVBPNnpZZkM5Tk1XQmR5MVhIWDhwc2txdTVJeGdnSm5N 
SUlDWXdJQkFUQm5NR0l4Q3pBSkJnTlYNCkJBWVRBbFZUTVF3d0NnWURWUVFLRXdOSlFrMHhKekFsQmdOVkJBc1RIbGRsWWxOd2FHVnlaU0JFWVhSaFVHOTMNClpYSWdRWEJ3YkdsaGJtTmxjekVjTUJvR0ExVUVBeE1UUTNW 
emRHOXRaWElnVW1Wc1pXRnpaU0JEUVFJQkZqQUgNCkJnVXJEZ01DR3FDQjJEQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUoNCkJURVBGdzB4TlRBeE1qY3hNVEF5TlRaYU1DTUdD 
U3FHU0liM0RRRUpCREVXQkJRbDc1cUJ3MWlWRHhkN0NjY1gNCjZ0UlNoVUJLblRCNUJna3Foa2lHOXcwQkNROHhiREJxTUFzR0NXQ0dTQUZsQXdRQktqQUxCZ2xnaGtnQlpRTUUNCkFSWXdDd1lKWUlaSUFXVURCQUVDTUFv 
R0NDcUdTSWIzRFFNSE1BNEdDQ3FHU0liM0RRTUNBZ0lBZ0RBTkJnZ3ENCmhraUc5dzBEQWdJQlFEQUhCZ1VyRGdNQ0J6QU5CZ2dxaGtpRzl3MERBZ0lCS0RBTkJna3Foa2lHOXcwQkFRRUYNCkFBU0NBUUF0NldRM2lzeExU 
WFA4S2FyaThhOVZQUlVIeFgza3U4ZHNvOVk3dVBjMmdaZHZNWHZJWEhXL3RhR0oNCk8wdjBRdm54OHpOdU5NTnpOMjdUalVhN1E2NUt5OXJrVllJRHY4aGdOM2NwemhLZmI2N0plQ0s5S1NjMVllQTMNCmY3TTdhUXcrV0ps 
WlpSTXVlZ2ZDK1BpMFNxZ1dXUTNVY1BIQlZvMFAzUDBRcXd2Mk1lQWJUZ1ROa1FMWm9pcU8NCkR4cVEvTjNaMzZrN25ORW85MUMvdks0SytmaklRWXplU09YbThJemd0NjlKd1BvYlhoUFhHZjBCRDNzUVVwTUENCm9QZ3E1 
WExXM2lzMi9pamd4RVA1a1ZQR2E5dFNPd1dEYkJ1RzBNTDNkVkhsQ2lidndBSkdyTVlWR3l2Q2o4UHANCmx1WmpFdWk3cEhkV2laSGZWSGlXajdHY3Z3SVUNCjwvc2lnbmF0dXJlPg0KPC9TZWN1cmVCYWNrdXBNYW5pZmVz 
dD4NCg==</dp:file><dp:file name="temporary://BackUpDir/cert.tgz">p6605/jI2ntpNM2jt0L0el8aq/fo+9OD2NsmfEF+P+whGQ/V1Bv94ph4FLcSm520piXl9krMYlwYnnWQl9uDNi25EIENdLHUHsnQFyJ 
ykYN4k2YwpZJRIp8M6cYQX1fEzfdW2rpZrvprgT85ncSrVZC66oTxE37qZxqPyJJAHfOTld0hYt2</dp:file></dp:response></env:Body></env:Envelope> 

а ниже команда не производит никаких выходных данных. Я ожидал, что это распечатать содержимое между temporary://BackUpDir/backupmanifest.xml"> и первым появлением </dp:file>

sed -n 's_<env:Envelope\(.*\)<dp:file name="temporary://BackUpDir/backupmanifest.xml">\([^>]*\)</dp:file>\(.*\)_\2_p' tmp2 

Где я совершаю ошибку? Извините за вставку огромного содержимого файла, но я не вижу возможности прикреплять файл сюда.

+0

Существуют ли в новой строки tmp2? – declension

+0

Нет, нет – user2607367

+1

Интересно, что это работает для меня (на sed 4.2.2 на Ubuntu), вырезав и вставив XML 'tmp2' и убедившись, что я удалил все новые строки (выходы' wc -l tmp2' 1) ... – declension

ответ

4

Ваш лучший выбор - использовать парсер . Я могу привести пример с . Используйте -N для добавления имен и -v добавить выражение , как:

xmlstarlet sel \ 
    -N 'dp=http://www.datapower.com/schemas/management' \ 
    -t \ 
    -v '//dp:file/text()' \ 
temp 

Это дает:

XJzLXJlc3VsdHMtYWN0aW9uX18i 
lc3VsdHMtYWN0aW9uX18i 

И те же со вторым:

xmlstarlet sel \ 
    -N 'dp=http://www.datapower.com/schemas/management' \ 
    -t \ 
    -v '//dp:file/text()' \ 
temp2 

Это дает :

PFNlY3VyZUJhY2t1cE1hbmlmZXN0Pg0KPGJhY2t1cG1hbmlmZXN0Pg0KIDx2ZXJzaW9uPlhJNTAuNi4wLjAu 
MTwvdmVyc2lvbj4NCiA8dGltZXpvbmU+R01UMEJTVDwvdGltZXpvbmU+DQogPGNvbmZpZz5hdXRvY29uZmlnLmNmZzwvY29uZmlnPg0KIDx0aW1lPjIwMTUtMDEtMjdUMTE6MDI6NTZaPC90aW1lPg0KIDxidWlsZD4yMzI3 
Nzc8L2J1aWxkPg0KIDxidWlsZGRhdGU+MjAxMy8wOC8wMSAxOTo0MzozNjwvYnVpbGRkYXRlPg0KIDxjb21tb25jcml0ZXJpYT5vZmY8L2NvbW1vbmNyaXRlcmlhPg0KIDxzZXJpYWxudW1iZXI+NjhBNTkyNjwvc2VyaWFs 
bnVtYmVyPg0KIDxjcnlwdG9DZXJ0aWZpY2F0ZT5zZWN1cmVfYmFja3VwPEZpbGVOYW1lPmNlcnQ6Ly8vc2VjdXJlX2JhY2t1cC1zc2NlcnQucGVtPC9GaWxlTmFtZT48L2NyeXB0b0NlcnRpZmljYXRlPg0KIDxlcGhlbWVy 
Ukhwc3Bxb0V0YlU0SDBtOVkNCkJzVHEwRFhiTUk4WGNMc1NiUGc5WktRdlBzY2Y5Q0sxRDhwdUJjODM0akNOaDJCQnhlWWdMTzhnUWg5NXVjNHENCjVtMTlWNnhNYVBPNnpZZkM5Tk1XQmR5MVhIWDhwc2txdTVJeGdnSm5N 
SUlDWXdJQkFUQm5NR0l4Q3pBSkJnTlYNCkJBWVRBbFZUTVF3d0NnWURWUVFLRXdOSlFrMHhKekFsQmdOVkJBc1RIbGRsWWxOd2FHVnlaU0JFWVhSaFVHOTMNClpYSWdRWEJ3YkdsaGJtTmxjekVjTUJvR0ExVUVBeE1UUTNW 
emRHOXRaWElnVW1Wc1pXRnpaU0JEUVFJQkZqQUgNCkJnVXJEZ01DR3FDQjJEQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUoNCkJURVBGdzB4TlRBeE1qY3hNVEF5TlRaYU1DTUdD 
U3FHU0liM0RRRUpCREVXQkJRbDc1cUJ3MWlWRHhkN0NjY1gNCjZ0UlNoVUJLblRCNUJna3Foa2lHOXcwQkNROHhiREJxTUFzR0NXQ0dTQUZsQXdRQktqQUxCZ2xnaGtnQlpRTUUNCkFSWXdDd1lKWUlaSUFXVURCQUVDTUFv 
R0NDcUdTSWIzRFFNSE1BNEdDQ3FHU0liM0RRTUNBZ0lBZ0RBTkJnZ3ENCmhraUc5dzBEQWdJQlFEQUhCZ1VyRGdNQ0J6QU5CZ2dxaGtpRzl3MERBZ0lCS0RBTkJna3Foa2lHOXcwQkFRRUYNCkFBU0NBUUF0NldRM2lzeExU 
WFA4S2FyaThhOVZQUlVIeFgza3U4ZHNvOVk3dVBjMmdaZHZNWHZJWEhXL3RhR0oNCk8wdjBRdm54OHpOdU5NTnpOMjdUalVhN1E2NUt5OXJrVllJRHY4aGdOM2NwemhLZmI2N0plQ0s5S1NjMVllQTMNCmY3TTdhUXcrV0ps 
WlpSTXVlZ2ZDK1BpMFNxZ1dXUTNVY1BIQlZvMFAzUDBRcXd2Mk1lQWJUZ1ROa1FMWm9pcU8NCkR4cVEvTjNaMzZrN25ORW85MUMvdks0SytmaklRWXplU09YbThJemd0NjlKd1BvYlhoUFhHZjBCRDNzUVVwTUENCm9QZ3E1 
WExXM2lzMi9pamd4RVA1a1ZQR2E5dFNPd1dEYkJ1RzBNTDNkVkhsQ2lidndBSkdyTVlWR3l2Q2o4UHANCmx1WmpFdWk3cEhkV2laSGZWSGlXajdHY3Z3SVUNCjwvc2lnbmF0dXJlPg0KPC9TZWN1cmVCYWNrdXBNYW5pZmVz 
dD4NCg== 
p6605/jI2ntpNM2jt0L0el8aq/fo+9OD2NsmfEF+P+whGQ/V1Bv94ph4FLcSm520piXl9krMYlwYnnWQl9uDNi25EIENdLHUHsnQFyJ 
ykYN4k2YwpZJRIp8 
+0

Я не могу найти запись для этого команда на машине Solaris, которую мы используем. – user2607367

+0

Упрощенный для того, что кажется действительно полезным инструментом (хотя и не в поле OP), о котором я не знал, но хотел ... – declension

+0

@ user2607367: Я тоже, вам нужно будет установить его из своего диспетчера пакетов, исходного кода или того, что вы знаете. – Birei

2

В соответствии с моим комментарием (и другим), нет ничего плохого в ваших командах sed (хотя, возможно, это не самое удобное и понятное решение в долгосрочной перспективе), похоже, это проблема новой строки.

Так, чтобы проверить, что это все в одной строке:

wc -l tmp2 

должен производить 1 ... и чтобы убедиться, что в любом случае:

tr -d '\n' tmp2 | sed -n ... 
+0

Я пробовал это: 'cat tmp2 | tr -d '\ n''' wc -l tmp2' выводит 0. – user2607367

Смежные вопросы