Строки извлечения между и включая 2 шаблона

Необходимо работать /opt/SolarisStudio12.3/bin/cc и никогда /usr/ucb/cc - ucb сценарий является старой оберткой совместимости для создания программного обеспечения SunOS 4, которое не работает с текущими выпусками Studio и было удалено из Соляриса 11 и позже.

Самый простой должен гарантировать это /opt/SolarisStudio12.3/bin находится в Вашем $PATH переменная среды перед /usr/ucb.

4
30.12.2014, 18:04
3 ответа

Вот решение SED решение , которое будет сводить в зависимости от одной последовательности ,, $ линий, следующих за последним, происходящим ^ 1 строки:

sed -e '/^1/{x;s/\n/ /gp;d' -e '};/,,$/H;$G;D
' <<\IN                                                                          
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, q1, q2, q3, q4, q5, q6, q7
2, q9, q10,,
2, r1, r2, r3, r4, r5, r6, r7
2, r9, r10,,
1, s1, s2, s3, s4, s5, s6, s7
2, s9, s10,,
IN

E X Изменения H H H Старые и шаблонные пространства на линиях, которые начинаются с ^ 1 и /// P rints Из H старое пространство было предыдущему для этого только в случае успешной замены. Линии, заканчивающиеся с , $ добавлены к H H Старое пространство после \ N символ EWLine, а затем все линии D к первому происходящему \ N EWLINE. На $ в последней строке H H Старое пространство добавляется к узору пространства после A \ N \ N EWLINE - так, когда он D Перезапускает линейный цикл в верхней части сценария, содержащего только то, что содержится H старое пространство, которое напечатано напечатано по мере необходимости.

Вывод:

1, p1, p2, p3, p4, p5, p6, p7 2, p9, p10,, 2, q9, q10,, 2, r9, r10,,
1, s1, s2, s3, s4, s5, s6, s7 2, s9, s10,,

Если, с другой стороны, вы не хотите последующую / ,,, $ / вхождений, то это может сделать:

sed -e '/^1/{x;y/\n/ /;s/,,.*/,,/p;d' -e '};/,,$/H;$G;D'

Учитывая одинаковый вход, который печатает вместо этого:

1, p1, p2, p3, p4, p5, p6, p7 2, p9, p10,,
1, s1, s2, s3, s4, s5, s6, s7 2, s9, s10,,

Но это получит / ,,, $ / линии, напечатанные, даже если они не сразу последуют / ^ 1 / совпадение. Если вы хотите, только если они будут немедленно последовательны в входе - вы можете сделать это, а также:

sed -n '/^1/!d;$p;N;/\n1/P;/,,$/s/\n/ /p;D'

, который работает таким образом:

  • Это сначала D Элементы из вывода всех линий ! не начинается с / ^ 1 /
    • , это включает в себя линии, приведенные в n , которые не заканчиваются / ,, $ / .
  • Если это то, что это $ последнее пространство шаблона ввода входной линии p RInted, потому что следующая команда завершится скриптом.
  • на / ^ 1 / соответствует его добавлению N входной линии входа в пространстве шаблона после \ N символа EWLINE.
  • Если прилагаемая линия также начинается с / \ N1 / . p Rints предыдущий.
    • P печатает только до первого происходящего \ N EWLILE в области шаблона.
  • После вытягивания в N P Ext входная линия, если шаблон $ заканчивается с помощью / ,,, $ / сопоставить его /// Ubstitute пространственный символ для вставленного \ N символ EWLINE и P Rints Результаты.
  • Узорное пространство всегда D , в том числе до первого происходящего \ N символ EWLINE.
    • ... Поэтому, когда линия N N Ext входная линия не совпадает / ,, $ / Отправляется обратно в верхнюю часть сценария как голова строки. Отказ Если в этот момент он не совпадает ^ 1 это D D полностью.
    • ... Поскольку / ,, $ / уже имел их \ N \ N EWLINE, полностью удаляемый на этот момент, они удаляются от расхода здесь.

Все это означает, что если / ^ 1 / линии следуют друг за другом, они все еще печатаются, и если линии, которые не заканчиваются в ,, $ Следуйте ^ 1 Они не напечатаны.

2
27.01.2020, 20:54

Что касается вашего первого запроса, вы можете использовать --e , чтобы объединить выражение в SED:

~$ sed -n -e '/^1/p' -e '/,,$/p' f
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, p9, p10,,
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,

, и если вы не хотите дубликата:

~$ sed -n -e '/^1/p' -e '/,,$/p' f | uniq
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,

с awk Комбинируйте Regex с ; :

~$ awk '/^1/;/,,$/' f
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, p9, p10,,
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2
27.01.2020, 20:54

Вы можете условно установить ORS, чтобы получить вывод в нужном формате

awk '/^1/,/,,$/{ORS = /^1/? ", ": "\n"; print}' file
1, p1, p2, p3, p4, p5, p6, p7, 2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7, 2, p9, p10,,
1
27.01.2020, 20:54

Теги

Похожие вопросы