2015-01-20 3 views
0

Мне нужно изменить количество пробелов в определенных положениях. Пример:Отступ в соответствии с последующей строкой

FixString VarString1 
    VarString2 
FixString VarString3 
    VarString4 

должен стать

FixString VarString1 
    VarString2 
    FixString VarString3 
    VarString4 

В моем приложении, FixString известная строка (которая может быть жестко) в то время как VarString1, VarString2 являются переменными строки.
Важно то, что пробелы перед FixString настраиваются на количество пробелов перед VarString. Таким образом, количество пробелов перед FixString может стать более или менее.

Надеюсь, вы можете мне помочь. Я мог бы, конечно, проанализировать файл назад, помня о отступе в предыдущей строке и применить его, если строка начинается с «* FixString» .... Но это кажется слишком сложным.

Теперь я реализовал идею Etan. Кажется, это работает на примере. Я должен попробовать это на моих реальных файлах ...

IFS='' 
MEMORY="" 
while read -r line 
do 
    STRIPPED=$(echo $line|sed 's/^ *//g') 
    if [ "${STRIPPED:0:9}" = "FixString" ] 
    then 
#  echo $line 
MEMORY=$line 
    else 
NUM=$(echo $line | sed 's/^\(*\).*$/\1/g') 
if [ ! -z $MEMORY ] 
then 
    echo -n $NUM 
    echo $MEMORY | sed 's/^ *//g' 
fi 
echo $line 
MEMORY="" 
    fi 
done < test.txt 
+0

Не уверен, что вы можете сделать это с помощью 'sed', но вы должны быть в состоянии сделать это с помощью' awk' достаточно легко. Распечатайте что-либо не «FixString» или «VarString». Удерживайте любую строку «FixString» до следующей строки, если «VarString» исправить отступ и распечатать еще одну строку. –

ответ

1

Вы можете попробовать это:

sed -r '/FixString/{N;s/^\s*(.*\n)(\s*)/\2\1\2/}' test.txt 

т.е. поиск FixString (/FixString/), добавьте следующую строку в шаблон пространства (N), поймать строку после первых пробелов ((.*\n)) до разрыва строки и захватить пробелы после разрыва строки ((\s*)). После этого замените это пробелами от начала второй строки (\2) + остальная строка первой строки, включая разрывы строки (\1) + снова пробелы (\2).

+0

Обратные ссылки могут включать обратные ссылки так: 'sed '/FixString/{N;s/^\s*\(.*\n\(\s*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ также выполняйте эту работу. – potong

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