두 개의 XML 파일이 있습니다. 첫 번째는 ~/tmp/test.xml
두 번째이고 /data/myuser/.mycontent/mytest.xml
첫 번째 XML 파일의 모든 내용을 두 번째 XML 파일의 35행에 추가하려고 합니다. 다음을 시도했지만 운이 없었습니다.
sed -n '35,~/tmp/test.xml`' /data/myuser/.mycontent/mytest.xml
(cat /data/myuser/.mycontent/mytest.xml; echo) | sed '35r ~/tmp/test.xml'
ed -s ~/tmp/test.xml <<< $'35r /data/myuser/.mycontent/mytest.xml\nw'
두 번째 XML 파일의 34번째 줄 중 33번째 줄이 비어 있습니다.
#the following tags contain employee location
첫 번째 XML 파일의 XML 태그
<Location "/mylocation">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
제가 뭘 잘못하고 있는 건지 조언 부탁드립니다.
편집 1
첫 번째 XML ~/tmp/test.xml
파일에는
<Location "/mylocation">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
두 번째 XML 에는 다음이 /data/myuser/.mycontent/mytest.xml
포함됩니다.
NameVirtualHost *:XXXX
<VirtualHost *:XXXX>
ServerName AAAAAAAA
# Manager comment 1
# Manager comment 2
# Manager comment 3
#
DocumentRoot "/data/myuser/.mycontent/"
# support email [email protected]
# started at 2010
<employee /*>
AllowOverride None
</employee>
<Location "/">
mylocation
Deny from all
</Location>
<Location "/icons/">
# employee info
my employee info
Allow from all
</Location>
DavLockDB /tmp/${APACHE_HOSTNAME}.DavLock
DAVMinTimeout 5000
LimitXMLRequestBody 0
# This should be changed to whatever you set DocumentRoot to.
## I need to add new tags here ##
<Location "/employee1">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
<Location "/employee2">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
## more tags same as above
## then manager comment
편집 2
두 번째 파일은 /data/myuser/.mycontent/mytest.xml
다음과 같아야 합니다.
NameVirtualHost *:XXXX
<VirtualHost *:XXXX>
ServerName AAAAAAAA
# Manager comment 1
# Manager comment 2
# Manager comment 3
#
DocumentRoot "/data/myuser/.mycontent/"
# support email [email protected]
# started at 2010
<employee /*>
AllowOverride None
</employee>
<Location "/">
mylocation
Deny from all
</Location>
<Location "/icons/">
# employee info
my employee info
Allow from all
</Location>
DavLockDB /tmp/${APACHE_HOSTNAME}.DavLock
DAVMinTimeout 5000
LimitXMLRequestBody 0
# This should be changed to whatever you set DocumentRoot to.
## I need to add new tags here ##
## this tag from first file
<Location "/mylocation">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
## edit end
<Location "/employee1">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
<Location "/employee2">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
## more tags same as above
## then manager comment
참고: 병합 위치를 지정 ## this tag from first file
하세요 .## edit end
답변1
GNU sed 사용:
file2.xml의 35행에 개행 문자를 사용하여 file1.xml을 삽입하려면 다음을 수행하십시오.
sed -e '34{p;g;r file1.xml' -e '}' file2.xml
file2.xml을 "제자리"에서 편집하려면 sed에 옵션을 추가하세요 -i
.
답변2
좋아, 내가 생각했던 것처럼 XML을 XML에 삽입하는 것이 아닙니다. 그렇다면 대답은 "파서를 사용하십시오"일 것입니다. 그러나 이는 사실이 아니며 단지 하나의 텍스트 파일을 다른 텍스트 파일로 병합하는 것입니다.
그래서 평소대로 할게요 perl
:
#!/usr/bin/env perl
use strict;
use warnings;
open ( my $insert, '<', '~/tmp/test.xml' ) or die $!;
open ( my $modify, '<', '/data/myuser/.mycontent/mytest.xml' ) or die $!;
open ( my $output, '>', '/data/myuser/.mycontent/mytest.xml.new' ) or die $!;
select $output;
while ( <$modify> ) {
if ( $. == 32 ) { print <$insert>; };
print;
}
이것은 트릭을 수행해야 합니다. 패드를 원하면 다음과 같이 압축할 수 있습니다.
perl -p -i.bak -e 'BEGIN { open ( $insert, "<", shift ) } if ( $. == 32 ) { print <$insert> }' ~/tmp/test.xml /data/myuser/.mycontent/mytest.xml
$.
"현재 줄 번호 "를 참고하십시오 perl
. 원하는 경우 다양한 유형의 조건을 적용할 수 있습니다. 정규식이 일치하는 경우와 같습니다(이것이 더 적절할 수 있으며 특정 프로필이 줄을 삽입하는 경향이 있습니다).
답변3
나는 당신이하려는 문제를 이해한다고 생각합니다. r
입력 프롬프트에 ead 파일을 삽입 하려는 것 같습니다 . 35번째 줄이라고 말했는데 그렇게 하면 sed 35r\ file
에 추가됩니다 35
. 프롬프트의 입력을 관찰하기가 어렵습니다.앞으로예측을 보장하지 않는 경우 출력을 작성해야 합니다. 예를 들어:
sed -e'$!N;/\n<Location "\/employee1">/r /tmp/file1' \
-eP\;D </tmp/file2 | tail -n30
이제 입력을 스캔하십시오.<Location /employee1>
file1
콘텐츠를 발견하기 직전에 삽입합니다.
DAVMinTimeout 5000
LimitXMLRequestBody 0
# This should be changed to whatever you set DocumentRoot to.
## I need to add new tags here ##
<Location "/mylocation">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
<Location "/employee1">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
<Location "/employee2">
first Address
second Address
Mylocation "XX/XX/XX/XX"
Myphone "XXXXXXX"
</Location>
## more tags same as above
## then manager comment