Я хочу заменить последний / на, - PullRequest
0 голосов
/ 03 мая 2019

Я хочу заменить это:

a/b/c|d,385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400/0.162,214|229|254|255|270|272|276|287|346|356|361|362|365|366|367|369/0.18,improve/11.11,

С:

a/b/c|d,385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400/0.162,214|229|254|255|270|272|276|287|346|356|361|362|365|366|367|369/0.18,improve,11.11,

С помощью этой команды sed:

sed -i 's/\(.*\)\//\1,/'

Это работает в Unix. Я пытался использовать это с системой в коде Perl, но это не работает. Я запрашиваю решение, используя sed в Perl для того же.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Во-первых, код, который вы утверждаете, не работает.

$ printf 'a/b/c\n' | sed 's/(.*)//\1,/'
sed: -e expression #1, char 9: unknown option to `s'

должно быть

$ printf 'a/b/c\n' | sed 's/\(.*\)\//\1,/'
a/b,c

Вы спрашиваете, как выполнить эту команду из Perl. Вы можете использовать следующее:

 system('sed', '-i', '/\\(.*\\)\\//\\1,/', '--', $qfn)

Обратите внимание, что вы можете довольно легко выполнить ту же задачу в самом Perl.

local @ARGV = $qfn;
local $^I = '';
while (<>) {
    s{^.*\K/}{,};
    print;
}
0 голосов
/ 03 мая 2019

Вот способ сделать это в sed:

echo "365|366|367|369/0.18,improve/11.11," | sed 's/^\(.*\)\/\(.*\)$/\1,\2/'

      365|366|367|369/0.18,improve,11.11,

Используется шаблон регулярного выражения:

^\(.*\)\/\(.*\)$

Это означает совпадение и захват всего до тех пор, пока не произойдет последний слеш. Затем также сопоставьте и захватите все после последней косой черты. Наконец, замените первые две группы захвата, но теперь они разделены запятой.

Примечания:

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