замена на основе положения / смещения - PullRequest
0 голосов
/ 05 апреля 2019

Я хотел заменить текст с позиции 11 на 18 текстом xxxxxxxxxx

Например: 0123456789 abcdeg1 23456efsgtext1234500th23sdfksbfk

в приведенной выше строке мой скрипт заменяет abcdeg1 (позиции с 11 по 18) на xxxxxxxx для этого я использую скрипт ниже perl -pe 's / ^ (. {10}). {8} / $ 1xxxxxxxxxxxxxxxxx /' awktest.2019> awktest.2019masked.txt

Теперь проблема в том, что он переставляется в каждой строке, даже если он пуст в этих позициях (с 11 до 18)

Может ли кто-нибудь помочь мне в добавлении нулевой проверки в тот сценарий, который я хотел заменить только в том случае, если захваченная группа не является нулевой в приведенной ниже команде (как добавить нулевую проверку в приведенной ниже команде)

perl -pe 's / ^ (. {10}). {8} / $ 1xxxxxxxxxxxxxxxxx /' awktest.2019> awktest.2019masked.txt

любая помощь приветствуется, Заранее спасибо

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Из вашего описания замена уже произошла в строках, которые вы определили как нулевые в позиции 11-18 , поэтому есть как минимум 8 совпадающих символов, но, вероятно, вы их не видите. скорее всего это просто пробелы. Если это так, вы можете просто добавить положительный якорь в шаблоне, чтобы убедиться, что в следующих 8 символах есть хотя бы один непробельный символ:

perl -lpe 's/^(.{10})(?=.{0,7}\S).{8}/$1xxxxxxxxxxxxxxxxx/' file

В добавленном подшаблоне (?=.{0,7}\S):

  • (?=...) - это якорь с положительным прогнозом, который не использует символы в сопоставлении и может служить проверкой состояния
  • .{0,7}\S означает 0-7 любых символов (кроме новой строки), за которыми следуют непробельные символы \S. чтобы убедиться, что в следующих 8 символах есть хотя бы один соответствующий \S
  • чтобы убедиться, что совпадения содержат хотя бы один видимый символ в позициях 11-18 , вы можете изменить \S на [^\x00-\x20], что включает в себя обратную сторону всех непечатаемых символов и ПРОБЕЛ ( \x20), см. Таблицу в https://web.itu.edu.tr/sgunduz/courses/mikroisl/ascii.html
0 голосов
/ 06 апреля 2019

использовать класс \ S;нет пробела

a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk

$ echo $a| perl -pe 's/(?<=^.{10})\S{8}/xxxxxxxxxxxxxxxxx/'

0123456789xxxxxxxxxxxxxxxxx3456efsgtext1234500th23sdfksbfk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...