2014-07-22 3 views
4

У меня есть файл вида:Sed и Awk вызывая линии наматывается вокруг

FA01_01:The birch canoe slid on the smooth planks 
FA01_02:Glue the sheet to the dark blue background 

мне это нужно, чтобы быть в форме (также обратите внимание на использование нижнего регистра):

<s> the birch canoe slid on the smooth planks </s> (FA01_01) 
<s> glue the sheet to the dark blue background </s> (FA01_02) 

поэтому я попытался следующее выражение с СЭД:

sed 's/\(.......\):\(.*$\)/(\1) <s> \2 <\/s>/' tmp.dat 

, но это то, что он вернулся:

</s> (FA01_01)anoe slid on the smooth planks 
</s> (FA01_02)eet to the dark blue background 

По какой-то причине кажется, что sed вызывает замену шаблона на начало строки, но только для второго совпадения. Пример:

$> sed 's/\(.......\):\(.*$\)/\1 \2/' tmp.dat 
FA01_01 The birch canoe slid on the smooth planks 

правильно, но

$>sed 's/\(.......\):\(.*$\)/\2 \1/' tmp.dat 
FA01_01h canoe slid on the smooth planks 

Это происходит даже с AWK, а также. Ради проверки гипотезы панорамную:

$> awk 'BEGIN{FS=":"}{print tolower($2) "XXX"}' tmp.dat 
XXX birch canoe slid on the smooth planks 

но

$> awk 'BEGIN{FS=":"}{print tolower($1) "XXX"}' tmp.dat 
fa01_01XXX 

Любые идеи, что бы быть причиной этой линии завернуть? Имеет ли это какое-либо отношение к тому факту, что второй шаблон или сохраненный столбец идет до конца строки?

ответ

5

Причина в том, что ваш tmp.dat, вероятно, находится в формате DOS (с символами \ r). Вы могли бы попытаться преобразовать его в формат Linux (только с \ п), например, с помощью команды:

dos2unix tmp.dat 

И затем выполнить:

sed 's/\(.......\):\(.*$\)/<s>\L \2 \E<\/s> (\1)/' tmp.dat 
+1

я не нашел программу dos2unix, так что я сделал «tr -d» \ r'' во временный файл. И ты прав. Я сделал несколько временных тестов, и символ '\ r' будет помещать то, что следует в начало текущей строки. Благодарю. – CoconutBandit

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