Преобразование регулярного выражения VS Code Editor в регулярное выражение sed

Правильно ли я перефразирую «Сценарий должен независимо доставлять прочитанные сканирования, но блокировать каждое сканирование после его появления в течение одной минуты»?

В вашем сценарии есть некоторые возможности для упрощения/оптимизации, и я предполагаю, что вы используете отредактированный тегbash(hoppla -bash...? )несмотря на шебанг, указывающий на другое... Таким образом, реализуя одноминутную паузу для отдельных сканирований, я попытался также воспользоваться возможностями, (используя echoдля команд, не установленных в моей системе -удалить, если доволен работой ). Попробуйте это и не стесняйтесь адаптировать:

VALID=(160650648 163686025 120806542 37206841)                          # define valid scans
BODY=(DoorBell "front sensor" "Back door sensor" "Second sensor")       # define body tests

while true
  do    scan=$(./RFSniffer)

        for IX in "${!VALID[@]}" "${#VALID[@]}"                         # 0 - 3 elements, and 4 to identify bad reads
          do    if [ "${scan:-FALSE}" = "${VALID[IX]}" ]                # compare 4 elements, the 5. tries to compare to "" empty
                  then  echo "Good Read"
                        echo "Your code is " $scan

                        if (( $SECONDS > ${LAST[IX]} + 60 ))            # test for one minute pause
                          then  if [ "$IX" = 0 ]                        # do this just for the "door bell"
                                  then  echo./buzzer.sh
                                        echo omxplayer -o local sleighbells.mp3
                                fi

                                echo curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="${BODY[IX]}" # &

                                LAST[IX]=$SECONDS                       # keep last scan occurrence
                          else  echo "pausing "                         
                        fi

                        break                                           # if good read - break out of the for loop to avoid the bad read msg
                fi

                if [ "$IX" = "${#VALID[@]}" ]                           # the fifth loop means no valid scan found

                  then  echo "BAD READ:  your code $scan and the valid ones don't match"
                        echo "Your correct valid code should be one of ${VALID[@]}"
                fi
          done

        sleep 5
  done
1
04.04.2021, 20:13
1 ответ

Проблема в том, что вы пытаетесь сопоставить несколько новых строк. Ваше регулярное выражение:

(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)

Это не то, что будет работать ни в одном из известных мне вариантов регулярных выражений. Ваш инструмент VSCode, похоже, использует разновидность регулярных выражений, где несколько ^неявно означают «совпадение между новыми строками». Большинство *nix-утилит работают с «записями» (строк ), определяемых завершающим символом \n. Вам нужны трюки, чтобы заставить их совпадать в нескольких строках.

Поскольку вы работаете в Linux, что означает, что у вас есть GNU sed, вы можете сделать это:

$ sed -Ez 's/^(<!-- HTTP Connector from upstream proxy -->)\n([^\n]*\n){3}/\1Hello World\n/' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello World

Или, в вашем случае, гораздо короче:

$ sed -Ez 's/^(<!--[^\n]*)\n([^\n]*\n){3}/\1Hello World\n/' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello World

Хитрость заключается в том, что -zзаставляет sedглотать весь файл и рассматривать его как одну "запись". Затем мы говорим ему найти <!--в начале записи и зафиксировать, что в качестве\1(вам нужны круглые скобки для захвата групп ), а затем сопоставить самый длинный участок не -символов новой строки до новой строки.([^\n]*\n)а затем еще три строки (строки означают не -символы новой строки, за которыми следует новая строка:([^\n]*\n){3}).

Для этой задачи я бы вообще не использовал регулярное выражение, а просто использовал бы номера строк:

$ sed '1s/$/Hello world!/; 2d;3d;4d' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello world!
0
28.04.2021, 22:54

Теги

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