2013-11-22 5 views
0

Рассмотрим следующий код:шаблон согласования с использованием переменной в SED

pattern="*.some_pattern.*" 
orignalLogFile='sample.log' 
outputFile='1.txt' 
temp='1.log' 

# match the pattern and replace with a new line 
sed 's/'$pattern'/\n/' $orignalLogFile > $temp 

Бросок

'СЭД: -e выражение # 1, символ 9: незакрытых `S' команда»

Как решить эту проблему?

ответ

1

Вы, вероятно, нужно два исправления

*. в вашем шаблоне не имеет смысла, так

pattern=".*some_pattern.*" 

Кроме того, вам необходимо пройти шаблон в двойные кавычки, чтобы защитить его от расширение оболочки

sed 's/'"$pattern"'/\n/' file 
1

Sed не принимает символы новой строки. AFAIK также не примет звезд; но я не думаю, что вам нужно будет их использовать.

pattern="some_pattern" 
orignalLogFile='sample.log' 
outputFile='1.txt' 

read -r < "${originalLogFile}" 

echo "${REPLY}" | sed s"@${pattern}@[email protected]" > newlog.tmp 

read newlog < newlog.tmp 

echo "${newlog}" | tr 'newline' '\n' > "${outputFile}" 
rm newlog.tmp 
+0

Использование прямого рисунка без использования его в переменной отлично работает. sed принимает заменяющие символы новой строки для рисунка sed /./pattern_logo. */\ n/'sample.log> newLog.txt Это прекрасно работает. Вероятно, когда у меня есть «patterntomatch» в переменной. – user170008

+0

Это может сработать для GNU sed в Linux, да; но это не совместимо с POSIX и, следовательно, не переносимо. Решение, которое я дал вам работы для FreeBSD, поэтому переносится; он будет работать с OSX и, предположительно, с любой другой UNIX. Утилиты GNU имеют расширения, которые нарушают стандарт POSIX; это одна большая причина, по которой я не пишу сценарии под Linux. Кроме того, вы можете обойти переменную, не работающую с sed, поставив ее в двойные кавычки, а не в сингл, как у меня там. – petrus4

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