2016-05-09 4 views
0

Я новичок в sed, и я потерял эту проблему. Существует одна строка в текстовом файле:sed не соответствует знаку равенства или распознает специальные символы после второй косой черты

start_year       = 1952, 

Мне нужно заменить начальный год число с годом число в массиве, скажем time_c = (1999 01 01)

. Таким образом, я проверил следующую команду:

txt=" start_year       = 1952," 
echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*=) (.*)/\1 [:blank:]${time_c[0]}/g' 

Но это только возвращает исходную строку раздели белых пространств:

start_year = 1952, 

Кажется, что СЭД признает только образец, если удалить знак равенства, потому что если я

echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*) (.*)/\1 = [:blank:]${time_c[0]}/g' 

Тогда результат:

start_year = [:blank:]${time_c[0]} 

Теперь sed, похоже, правильно распознал. Но почему, почему это не интерпретирует [: blank:] и мою переменную?

Еще одна минута заключается в том, что я хотел бы сохранить исходные пробелы в замененном тексте, если это возможно. Это не имеет значения для моей программы, но это делает замененную линию более приятной с другими.

Может кто-нибудь помочь? Большое спасибо!

+0

Добро пожаловать на Stack Overflow. Обратите внимание, что предпочтительный способ сказать «спасибо» здесь ответы на вопросы и полезные ответы (если у вас достаточно репутации, чтобы сделать это), и, приняв наиболее полезный ответ на любой заданный вами вопрос (что также дает вам небольшой импульс для вашей репутации ). См. Страницу [About], а также [Как задать вопросы здесь?] (Http://stackoverflow.com/help/how-to-ask) и [Что мне делать, когда кто-то отвечает на мой вопрос ? ?] (http://stackoverflow.com/help/someone-answers) –

ответ

0

Корпуса не делать замены любого рода внутри одинарные кавычки.

Кроме того, классы символов - [[:space:]] с удвоенными скобками. Вы можете делать такие вещи, как [^[:space:][:digit:]] (не пробел или цифра). И текст замены не хочет [:space:] появляться - ну, скорее всего, это не

Это работает:

time_c=(1999 01 01) 
txt=" start_year       = 1952," 
echo "$txt" | sed -r 's/([[:blank:]]*start_year[[:blank:]]*=) (.*)/\1 '"${time_c[0]}"'/g' 

Обратите внимание, как расширение переменной оболочки осуществляется за пределами одинарные кавычки, так и внутри двойных кавычек - это вообще хорошая идея (вне одиночных кавычек имеет решающее значение, внутри двойных кавычек - хорошая идея).

Он производит:

start_year       = 1999 
+0

Спасибо. Теперь я вижу необходимость в внешних скобках. – eddieisnutty

1

попробовать это

$ time_c=(1999 01 01); echo " start_year       = 1952," | 
sed -r "s/(\s*start_year\s+=\s*)(.*)(,)/\1${time_c[0]}\3/" 

start_year       = 1999,