2013-12-26 2 views
1

Я пытаюсь вставить несколько строк перед определенной строкой в ​​XML-файле. Хотя он работает, но форматирование не сохраняется. Ведущие пробелы игнорируются. Я знаю, что мы должны использовать IFS =, и я также перекрестно проверил его в следующей ссылке, кроме многих других, но безрезультатно. :(Предотвращение игнорирования ведущих пробелов с использованием IFS =

Может кто-нибудь, пожалуйста, указать на ошибку я совершаю здесь

Preserving leading white space while reading>>writing a file line by line in bash

while read line 
do 
    pattern=keepDependencies 
    input_file=/home/john/data_file 
    file_to_change="${backup_dir}/"$line"/config.xml" 

    while IFS= read -r insert_text 
    do 
     sed -i "/$pattern/i $insert_text" $file_to_change 
    done < "$input_file" 
done < days_to_keep_absent 



Файл данных:

[john ~]$ cat data_file 
    <logRotator> 
     <daysToKeep>-1</daysToKeep> 
     <numToKeep>5</numToKeep> 
     <artifactDaysToKeep>-1</artifactDaysToKeep> 
     <artifactNumToKeep>-1</artifactNumToKeep> 
    </logRotator> 



config.xml:

<?xml version='1.0' encoding='UTF-8'?> 
<project> 
    <actions/> 
    <description>I&apos;ll clean all the temporary permissions</description> 
    <keepDependencies>false</keepDependencies> 
    <properties> 
    <hudson.security.AuthorizationMatrixProperty> 
    ... 
    ... 



Выход:

<?xml version='1.0' encoding='UTF-8'?> 
<project> 
    <actions/> 
    <description>I&apos;ll clean all the temporary permissions</description> 
<logRotator> 
<daysToKeep>-1</daysToKeep> 
<numToKeep>5</numToKeep> 
<artifactDaysToKeep>-1</artifactDaysToKeep> 
<artifactNumToKeep>-1</artifactNumToKeep> 
</logRotator> 
    <keepDependencies>false</keepDependencies> 
    <properties> 
    <hudson.security.AuthorizationMatrixProperty> 
    ... 
    ... 
+0

Не могли бы вы опубликовать config.xml и фактический выход? – l0b0

+0

Добавлен файл config.xml и фактический результат. – Technext

ответ

1

это не read, что дает вам проблемы. Это sed.

Обычный (и, насколько мне известно, единственный совместимый с Posix) способ выдачи команды i заключается в немедленном следовании ей с помощью обратной косой черты и новой строки. Аргумент состоит из последующих строк до первого не прекращается с обратной косой черты:

/pattern/i\ 
    This text is inserted\ 
So is this text. 

ГНУ sed позволяет вставить текст, чтобы начать на одной и той же линии, что и i, после любого пробельных. Вот почему ваши пробелы удаляются.

Попробуйте это:

while read line 
do 
    pattern=keepDependencies 
    input_file=/home/john/data_file 
    # Note: I fixed quoting in the following line. 
    file_to_change="$backup_dir/$line/config.xml" 

    while IFS= read -r insert_text 
    do 
    # Note: \\ is reduced to \ because it is inside a double-quoted string 
    # The newline is inserted directly. So sed sees i\<newline><inserted text> 
    sed -i "/$pattern/i\\ 
$insert_text" "$file_to_change" 
    done < "$input_file" 
done < days_to_keep_absent 

Я считаю, что стиль немного трудно читать, так что я обычно делаю что-то вроде этого:

ICMD='i\ 
' 

# ... 

sed -i "/$pattern/$ICMD$insert_text" "$file_to_change" 
+0

Спасибо за объяснение и пример @rici! Он работал как шарм. :) Эта проблема действительно беспокоила меня. – Technext

0

Это особенность чтения (и функции многих других оболочки).

Вы могли бы работать вокруг него: просто предварять полукокс (например: «|») в файл, и считать, что, когда вы выводите линию

Я повторно использовать алгоритм без проверки (вы говорите, это делать то, что вам это нужно, пропавшую без вести ведущий пробельные), за исключением:

петли в то время как становится:

sed -e 's/^/|/' < "${input_file}" > "${input_file}_modified" 
while IFS= read -r insert_text 
do 
    sed -i "/$pattern/i $(echo "$insert_text" | sed -e 's/^|//')" $file_to_change 
done < "${input_file}_modified" 

Надеется, что это помогает

+0

Спасибо за предложение, но нет никакой разницы в выходе. – Technext

+0

На самом деле, если вы делаете 'IFS = read -r', вы получите именно ту пустоту, с которой вы начали. – rici

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