2017-01-27 2 views
0

В Mac OSX, но мне нужно, чтобы скрипт был кросс-платформой для Linux, поскольку существуют различия между GNU sed и OSX sed.Использование диапазона поиска SED и его дублирования

У меня есть файл, который использует выраженные выражения, чтобы сообщить моему сценарию дублировать весь диапазон. Вот мое текущее решение. Я пробовал использовать/a и/i, используя различные флаги, и я продолжаю получать несколько ошибок адресов.

#!/bin/bash 
... 

stream=$(`cat file.txt`) 
for i in 3; do 
    stream=$(echo "$stream" | sed '/%%RANGE_STUB/,/%%/ p ') 
done 

В настоящее время это берет мой файл и дублирует колебались содержание внутри само по себе. Мне нужно, чтобы он пошел после.

Вот файл:

Some text here. 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

Вот результат:

Some text here. 

%%RANGE_STUB 
%%RANGE_STUB 
%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 
%% 
%% 

Вот желаемый результат:

Some text here. 

%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 
+1

sed для простых подстановок на отдельных линиях, то есть все. Для чего-либо еще вы должны использовать awk. Выражения диапазона делают тривиальные задачи очень незначительными, но затем требуют дублирования условий или полного переписывания при минимальном изменении требований, поэтому его следует избегать в пользу флага (тривиально реализованного в awk). Вы уже знаете, что у sed проблемы с переносимостью, поэтому просьба о переносном решении sed не имеет столь же большого смысла, как просто запрос на решение awk. –

+1

да, что имеет смысл – Maverick

ответ

2
$ cat tst.awk 
/%%RANGE_STUB/ { inBlock = 1 } 
inBlock { 
    block = block $0 ORS 
    if (/%%$/) { 
     for (i=1; i<=3; i++) { 
      print block 
     } 
     inBlock = 0 
    } 
    next 
} 
{ print } 
$ 
$ awk -f tst.awk file 
Some text here. 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 
+0

Мне нужна переменная, которую нужно передать за несколько циклов. Когда я закончу, это будет динамично. – Maverick

+0

команда -v в awk делает трюк – Maverick

2

Вы можете использовать awk вместо sed на OSX:

awk '/%%RANGE_STUB/{p=1} p{s = s RS $0} 1; 
    p && /%%$/{for(i=1; i<=3; i++) print s; p=0; s=""}' file 

Some text here. 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 

%%RANGE_STUB 
This content is copied and preserved including the RANGE_STUB and double % symbols 
%% 
+0

, но это кроссплатформенность – Maverick

+0

Также важно сохранить цикл for, потому что я пишу скрипт, который отслеживает другие данные. Так что придерживаться этого для цикла внутри скрипта awk является запутанным и ограничивающим. – Maverick

+2

@Maverick, что awk-скрипт будет работать как есть на каждом awk в каждом окне UNIX. Если вам нужно сделать больше, чем вы описали, вы должны уточнить свои потребности, поскольку писать цикл оболочки просто для манипулирования текстом - это всегда неправильный подход (см. [Why-is-use-a-shell-loop-to-process-text -занятая-плохая практика] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)), d быть жестким для любого, кто с чистой совестью предложить решение, в котором используется одно, что вы сказали нам до сих пор. –

0

Для двух экземплярах (один дублирование частот), не добавляется линия ломает:

echo "$stream" | sed -e '/%%RANGE_STUB/,/%%/{//\!H;/%%RANGE_STUB/h;/%%$/{H;G}}'

или (другая команда группировка, одни и те же эффекты):

echo "$stream" | sed -e '/%%RANGE_STUB/,/%%/{//\!H};/%%RANGE_STUB/h;/%%$/{H;G}'

Что они представляют собой составляет:

  • h - заменить удержания space-- на первую линию диапазона
  • H - добавляемая к трюму space-- для промежуточных линий диапазона
  • H;G - добавляет держать пробел, затем добавить цельный hold space - для конечной линии диапазона.

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

Ваш конечный образец был изменен на /%%$/, чтобы убедиться, что он соответствует только последнюю строку диапазона для H;G

Вы получаете:

Some text here. 

%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 
%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 

Это очень сложно сделать с СЕПГ, я думаю, чтобы получить 3 копии с повторными вызовами сценария. Вы можете получить полномочия 2, повторяя sed - каждое обращение удваивает копии.

Так 3-х экземплярах, вы могли бы сделать это в одном сценарии:

echo "$stream" | sed -e '/%%RANGE_STUB/,/%%/{//\!H};/%%RANGE_STUB/h;/%%$/{H;G;G}'

Some text here. 

%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 
%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 
%%RANGE_STUB 
This contents is copied and preserved including the RANGE_STUB and double % symbols 
%% 

Предположительно можно построить строку с переменным числом ;G команд в вашей обертку сценария.

+0

Я получаю ** недействительный код команды H ** – Maverick

+0

В скрипте может не хватить '//!' На '// \!'. Я тестировал это как командную строку и неубежденную '! 'вызывает проблемы. Дайте мне знать, и я переключу предлагаемые решения на unescaped. – stevesliva

+0

ah ok имеет смысл. Я отступаю от компиляции в течение 10 минут, когда обновляется, когда я вернусь – Maverick

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

  • Нет связанных вопросов^_^