Использование grep для замены каждого экземпляра шаблона после первого в bbedit - PullRequest
0 голосов
/ 12 августа 2011

Итак, у меня есть действительно длинный текстовый файл, который следует этому шаблону:

},
"303" :
{
   "id" : "4k4hk2l",
   "color" : "red",
   "moustache" : "no"
},
"303" :
{
   "id" : "4k52k2l",
   "color" : "red",
   "moustache" : "yes"
},
"303" :
{
   "id" : "fask2l",
   "color" : "green",
   "moustache" : "yes"
},
"304" :
{
   "id" : "4k4hf4f4",
   "color" : "red",
   "moustache" : "yes"
},
"304" :
{
   "id" : "tthj2l",
   "color" : "red",
   "moustache" : "yes"
},
"304" :
{
   "id" : "hjsk2l",
   "color" : "green",
   "moustache" : "no"
},
"305" :
{
   "id" : "h6shgfbs",
   "color" : "red",
   "moustache" : "no"
},
"305" :
{
   "id" : "fdh33hk7",
   "color" : "cyan",
   "moustache" : "yes"
},

, и я пытаюсь отформатировать его как правильный объект json со следующей структурой ....

"303" :
   { "list" : [
     {
      "id" : "4k4hk2l",
      "color" : "red",
      "moustache" : "no"
     },
     {
      "id" : "4k52k2l",
      "color" : "red",
      "moustache" : "yes"
     },
     {
      "id" : "fask2l",
      "color" : "green",
      "moustache" : "yes"
     }
    ]
   }
"304" :
   { "list" : [
 etc...

означает, что я ищу все шаблоны ^ "\ d \ d \ d": и оставляю первый уникальный, но удаляю все последующие (например, оставьте первый экземпляр "303":но полностью удалите остальные из них. затем оставьте первый экземпляр «304»; но полностью удалите все остальные и т. д.).

Я пытался сделать это в приложении bbedit, который имеет опцию grep для поиска / замены.Мой шаблонный фу слишком слаб для этого.Есть идеи?Или лучший способ выполнить эту задачу?

1 Ответ

1 голос
/ 15 августа 2011

Вы не можете захватить повторяющуюся группу захвата. Захват всегда будет содержать только последнее совпадение группы. Таким образом, вы не сможете сделать это с помощью одного поиска / замены, за исключением глупого повторения вашей группы в шаблоне. Но даже это может быть решением, только если вы знаете максимальное количество элементов в результирующих группах.

Скажем, у нас есть упрощенная версия ваших данных:

1a;1b;1c;1d;1e;2d;2e;2f;2g;3x;3y;3z;

Мы видим, что максимальное количество элементов равно 5, поэтому мы повторяем группу захвата 5 раз.

/([0-9])([a-z]*);?(\1([a-z]);)?(\1([a-z]);)?(\1([a-z]);)?(\1([a-z]);)?/

И заменить это на

\1:\2\4\6\8\10; 

Тогда мы получим желаемый результат:

1:abcde;2:defg;3:xyz;

Вы можете применить эту технику к своим данным, если вы очень торопитесь (а через 2 дня я полагаю, что нет), но использование некоторого языка сценариев будет лучшим и более чистым решением.

Для моего упрощенного примера вы должны выполнить итерации по совпадениям /([0-9])[a-z];?(\1[a-z];?)*/. Это будет:

1a;1b;1c;1d;1e;
2d;2e;2f;2g;
3x;3y;3z;

И там вы можете захватить все значения и связать их с отзывчивым ключом, который является только одним для каждой итерации.

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