2013-05-23 2 views
0

Я пытаюсь изменить строку типаSED заменить конец строки с текстом и цитатой

DIRLIST="DIR/1 DIR/2 DIR/3" 

включить новый DIR/4, используя Баш скрипт, где DIR/4 является командой линия аргумент

на данный момент, это мой код для замены

sed "#DIRLIST#s#$# $logFolder\"#g" compress_log.sh > tmpCompress 

это должно заменить $ с содержанием LogFolder на каждой строке, содержащей DirList, и перенаправить его на tmpCompress, не так ли?

Проблема, с которой я сталкиваюсь, я думаю, что это связано с косой чертой и цитатами и подобными.

Любая помощь очень ценится

ответ

2

Строка ниже будет работать. Она

  • поиск всех линий, которые имеют DirList
  • Изменяет "в конце линии ....
  • „$ LogFolder“, а затем ...
  • символ "

    sed '/DIRLIST/ s:"$:'"$logFolder"'":'

, но это может быть легче понять, если я разбить его на куски

sed '/DIRLIST/ s:"$:'   "$logFolder"    '":' 

Пожалуйста, помните, что вы можете использовать два типа кавычки в одной строке и что целью цитат является предотвращение интерпретации специальных символов. В первой части я использую одинарные кавычки, потому что я хочу процитировать как двойную цитата и знак доллара. Во второй части я заключу в двойные кавычки, так что $ интерпретируется как переменная, и в случае, если в значении переменной есть специальный символ (если он не содержит двоеточие). В третьей части я использую одинарные кавычки, чтобы заключить двойную кавычку и двоеточие (последний двоеточие в шаблоне s:old:new:).

Я предпочитаю использовать «..» вместо «...» в сценариях sed по привычке. Это безопаснее.

1

Не уверен, что если #DIRLIST# должен соответствовать шаблону, /DIRLIST/ будет делать, хотя.

$ export logFolder=NEWDIR 
$ echo 'DIRLIST="DIR/1 DIR/2 DIR/3"' | sed "/DIRLIST/ s#\"\$# $logFolder\"#g" 
DIRLIST="DIR/1 DIR/2 DIR/3 NEWDIR" 
+0

это делает работу, но я не думаю, что вы можете добавить несколько ответов, так что спасибо в любом случае, но я собираюсь принять Bruces ответ, из-за слишком дополнительную информацию. – ShadowFlame

1

Эта команда сделает это:

sed -e "#DIRLIST# s#\"\$# $logFolder\"#g" compress_log.sh > tmpCompress 

Причина ваша версия не удается, что «$ #» замещается числом позиционных аргументов, для интерактивных оболочек равна нулю.

В результате sed выполняет этот скрипт вместо:

#DIRLIST#s#0 <value of logFolder>"#g 

Вы могли бы заметить, что если вы предваряетесь ваша команда с эхом, как это:

echo sed "#DIRLIST#s#$# $logFolder\"#g" compress_log.sh 

Чтобы избежать этого побега «$» с обратной косой чертой.

Далее, поскольку вам нужно добавить новую папку внутри цитат, вам необходимо также сопоставить и заменить последнюю цитату.

Кроме того, флаг «g» не нужен, поскольку в каждой строке есть только один «конец строки», соответствующий «$», поэтому он не может сравниться более одного раза.

+0

Это не работает в моей системе. Вам нужно изменить '# DIRLIST #' на '/ DIRLIST /' –

+0

спасибо за информацию, но уже принял другой ответ. – ShadowFlame

1

следующие работы: а

old_folder='DIR[/]1 DIR[/]2 DIR[/]3' 
sed "/""${old_folder}""/"' s#$# '"$logFolder"'#' 
+0

да, но это потребует знать, какие папки я уже включил, тогда как мое решение должно работать и для неизвестных папок, а также – ShadowFlame

+1

@ShadowFlame, исправлено – iruvar

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