Изменение узла XML в файле с помощью sed, tr или perl - PullRequest
0 голосов
/ 03 января 2012

У меня есть один XML-файл.скажем, sample.xml со случайным положением табуляции и пробелов:

<T1>
     <S1 >  D1 </S1>
 <S1>D2   </  S1>
 < S2 >D3  </S2>
 <S3> D4</S3>
</T1 >

Я хочу изменить данные и формат на что-то вроде этого

<T1>
 <S1>D5</S1>
 <S1>D6</S1>
 <S2>D7</S2>
 <S3>D8</S3>
</T1>

Я пробовал в sed, ноне работает для случая с несколькими строками, как здесь.Как я могу достичь того же.

Ответы [ 4 ]

1 голос
/ 04 января 2012

Удалите все пробелы из файла, а затем отформатируйте его, используя xmllint

$ sed 's/[[:space:]]//g' test.xml | xmllint --format -
<?xml version="1.0"?>
<T1>
  <S1>D1</S1>
  <S1>D2</S1>
  <S2>D3</S2>
  <S3>D4</S3>
</T1>

Фон

Как указывает @choroba, ваши входные данные не являются действительным файлом XML:

$ cat test.xml
<T1>
     <S1 >  D1 </S1>
      <S1>D2   </  S1>
       < S2 >D3  </S2>
        <S3> D4</S3>
        </T1 >

Команда xmllint сообщает, почему:

$ xmllint test.xml
test.xml:3: parser error : expected '>'
      <S1>D2   </  S1>
                   ^
test.xml:3: parser error : Opening and ending tag mismatch: S1 line 3 and unparseable
      <S1>D2   </  S1>
                   ^
test.xml:4: parser error : StartTag: invalid element name
       < S2 >D3  </S2>
        ^
test.xml:4: parser error : Opening and ending tag mismatch: T1 line 1 and S2
       < S2 >D3  </S2>
                      ^
test.xml:5: parser error : Extra content at the end of the document
        <S3> D4</S3>
        ^
1 голос
/ 03 января 2012

Пробелы после < или </ не разрешены в XML. Ваш XML не правильно сформирован и поэтому не может быть обработан специализированными инструментами. Обычно это должно работать:

xmllint --format file.xml
1 голос
/ 03 января 2012

Это должно работать - tr -d ' ' < file

Ваш файл:

[jaypal:~/Temp] cat file
<T1>
     <S1 >  D1 </S1>
 <S1>D2   </  S1>
 < S2 >D3  </S2>
 <S3> D4</S3>
</T1 >

Тест:

[jaypal:~/Temp] tr -d ' ' < file
<T1>
<S1>D1</S1>
<S1>D2</S1>
<S2>D3</S2>
<S3>D4</S3>
</T1>
1 голос
/ 03 января 2012
 sed -r 's/\s//g' yourXML

работает ли приведенная выше строка sed?

kent$  cat v.xml
<T1>
     <S1 >  D1 </S1>
 <S1>D2   </  S1>
 < S2 >D3  </S2>
 <S3> D4</S3>
</T1 >

kent$  sed -r 's/\s//g' v.xml
<T1>
<S1>D1</S1>
<S1>D2</S1>
<S2>D3</S2>
<S3>D4</S3>
</T1>

Вы должны убедиться, что в вашем XML-файле нет пробелов в тегах и значениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...