Использование SED и/или AWK для замены строки шаблоном

А если вы используете system()для вызова uname -mи проверки архитектуры вашего ядра?

if system("uname -m") == "armv7l\n"
  set foo
  set bar
endif

Исправление, предложенное в комментариях для добавления \nк строке сравнения, так как uname -mдобавит новую строку после выполнения команды.

-2
02.09.2020, 10:15
2 ответа

Со стандартным sedвы бы поступили так:

sed  's/# *>#> *\(.*\)/some_fn("\1")/' file
  • Ваш шаблон #>#>, кажется, допускает несколько дополнительных пробелов, поэтому я использовал # *>#> *в качестве шаблона. Пожалуйста, адаптируйте его, если разрешены другие пробелы.
  • .*соответствует остальной части строки. Я поместил его внутрь \(\), поэтому я могу ссылаться на него в замене как\1
1
18.03.2021, 23:08

С этим можно быстро справиться, используя GNU sedи параметр расширенного регулярного выражения -E.

$ sed -Ee 's/^(\s+)#\s*>#>\s*(\S.*)/\1some_fn("\2")/' file
  • ^ (\s+ )запомнит уровень отступа
  • #и > #> — две строки, за которыми могут следовать пробелы.
  • (\С. *)сохраняет часть сообщения
  • затем на замещающей части вспоминаем уровень отступа \1 и сообщение \2и чередуем со строкой some _fn

Или, с помощью awk, мы выбираем разделитель полей как регулярное выражение #\s*>#>\s*, поэтому тогда уровень отступа равен $1, а сообщение$2

$ awk '
    BEGIN {
      s = "[[:blank:]]*" 
      FS = "#" s ">#>" s
      OFS = ""; q = "\""
    }
    NF > 1 {
      $2 = "some_fn(" q$2q ")"
    }1
' file
0
18.03.2021, 23:08

Теги

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