2016-09-29 7 views
1

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

Сценарий:

var1=`grep "keyS.log\" type=" /C/tst/tst.txt` 
x="<\!--" 
if echo "$var1" | grep -q "$x"; then 
    echo "Already disabled"; 
else 
prefix='<!-- ' 
sufix='-->' 
modified=`echo "${var1/[[:space:]]/}" | sed 's:^.\(.*\).$:\1:'` 
final="${prefix}${modified}${sufix}" 
echo "${final}" 
`sed -i 's/${var1}/${final}/g' /C/tst/tst.txt` 
fi 

Line Я пытаюсь изменить в файле, как это:

<category="keyS" priority="1" appender="/tmp/keyS.log"/> 

и должен быть таким:

<!-- category="keyS" priority="1" appender="/tmp/keyS.log"/--> 

Есть несколько линий начиная с категории и может существовать другой путь за appender = так что он динамический.

Ошибка, как: СЭД: 1: "/C/tst/tst.txt": Неопределенная метка 'улица/tst.txt'

Когда я попытался использовать

cat /C/tst/tst.txt | sed 's/${var1}/${final}/g' >> /C/tst/tsttmp.txt 

линии не изменяется в tsttmp.txt, и я потерял также межстрочный интервал, поэтому весь текст - одна строка.

Заранее спасибо за любую помощь

Станислав

ответ

1

Если я правильно понял ваш вопрос правильно, ниже, что вам нужно:

sed 's/^<\(category=.*keyS.log.*\)>$/<!-- \1-->/' /C/tst/tst.txt 

СЕПГ паттерна

  • выглядит для линии, начинающейся с <, а затем category. Это будет проигнорировано, если уже закомментировано, поскольку в этом случае < не будет следовать category.
  • Образец помещен в () будет сохранен как \1 (и так далее). Здесь мы ищем keyS.log.
  • В случае, если выше двух совпадений, замещающая часть добавит комментарии в стиле html.

ПРИМЕЧАНИЕ: Я не использовал -i вариант СЭД для замены встроенного. Вы можете использовать его, как только вы убедитесь, что это работает для вас.

2

shell предназначен для вызова инструментов и управления файлами/процессами, а не для манипулирования текстом. Стандартный инструмент для обработки текста общего назначения UNIX - awk. Переводя ваш скрипт в AWK это:

awk ' 
/keyS.log" type=/ { 
    if (/<!--/) { 
     print "Already disabled" |"cat>&2" 
    } 
    else { 
     sub(/</,"<!-- ") 
     sub(/>/,"-->") 
    } 
} 
1' /C/tst/tst.txt 

Использование awk -i inplace 'script' file с GNU AWK или awk 'script' file > tmp && mv tmp file с другими awks перезаписать исходный файл.

Обратите внимание, что регулярное выражение из вашего сценария, keyS.log" type=, не существует в введенном вами примере ввода, <category="keyS" priority="1" appender="/tmp/keyS.log"/>, поэтому вам придется изменить это на то, что делает, если ваш размещенный образец ввода является точным.

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