파일이 있어요uca.xml(사용자 정의 작업을 위한 Thunar 구성):
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
<!--some code-->
</action>
</actions>
<--blank line here-->
이 파일을 참고하세요빈 줄로 끝남
파일을 삽입하는 bash 명령/스크립트를 원합니다.맞춤작업.txt포함하다:
<action>
<!--custom configuration-->
</action>
그러면 다음과 같이 됩니다.
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
<!--some code-->
</action>
<action>
<!--custom configuration-->
</action>
</actions>
나는 주어진 방법을 시도했다제프 가뉴:
sed -n -i -e '/<\/actions>/r customAction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml
하지만레이블 아래에 하나 이상의 문자(빈 줄 아님)가 삽입된 경우에만 작동합니다..
임시 해결 방법은 스크립트입니다.
echo "someDummyText" >> uca.xml
sed -n -i -e '/<\/actions>/r customaction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml
sed -i 's/someDummyText//' uca.xml
sed -i '${/^$/d;}' uca.xml
그러나 나는 sed가 더 우아한 한 줄 솔루션을 가지고 있다고 믿습니다. 미리 감사드립니다.
노트:이 글은 제가 U&L 커뮤니티와 StackExchange 커뮤니티에 올린 글이므로 양해해 주시고, 제가 잘못한 부분이 있으면 주저하지 말고 자세하게 지적해 주시기 바랍니다. SE FAQ를 읽고 다른 곳에서 답변을 찾으려고 노력했지만 운이 없었습니다.
답변1
귀하의 솔루션이 완전히 충분하다고 생각합니다. 마지막 2개의 sed를 하나로 교체하여 최적화할 수 있습니다.
sed -i '$d' uca.xml
결국, 무엇을 삭제할지 알 수 있도록 추가 행을 거기에 넣기만 하면 됩니다.
대체 솔루션을 찾고 있다면 sed를 사용하여 패턴 일치의 줄 번호를 가져온 다음 -1을 사용하여 읽을 수 있습니다.
if lno=$(sed -n -e '/<\/actions>/=' uca.xml)
then let lno=lno-1
sed -i -e "$lno"'r customaction.txt' uca.xml
fi
또는 오래되었지만 유용한 명령을 선호한다면 ed
다음을 수행할 수 있습니다.
ed -s uca.xml <<\!
?</actions>
-1r customaction.txt
w
q
!
답변2
sed
읽기( ) 명령을 사용하십시오 r
:
$ sed '\#</action>#r customAction.txt' uca.txt
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
<!--some code-->
</action>
<action>
<!--custom configuration-->
</action>
</actions>
입력 파일 끝에는 출력에 유지되는 빈 줄이 있습니다. 이 r
명령은 주어진 패턴을 찾은 후 주어진 파일의 내용을 삽입합니다. 문자열은 한 번만 나타나므로 이는 샘플 데이터에서 예상대로 작동합니다 </action>
. 입력 파일에 기존 작업이 더 있으면 예상대로 작동하지 않습니다.
다음은 여러 작업이 포함된 파일에 적용됩니다.
gsed -e '\#</actions>#d' -e '$ r customAction.txt' -e '$ a\</actions>' uca.txt
태그가 발견되면 제거하고 </actions>
끝에 내용을 삽입합니다. customAction.txt
그리고 </actions>
그 뒤에 추가됩니다.
이 명령 작성 방법에는 a
GNU가 필요합니다 sed
(so gsed
).