sed: Как удалить все в строке после двух слешей //? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть строка с кодом

require_once(PATH_ROOT).'/calls/inumber.php'); //this is a comment<br>

Я хочу удалить все с помощью SED после //.Моя первая попытка была

sed -i 's/[//].*//' file;

Но это удаляет все после (PATH.ROOT). '/
Я хочу удалить комментарий, а не PATH.Ir не в приведенном выше примере, но как я могу исключить SED, чтобы не удалять после http: // потому что есть два // тоже.

EDIT: Хорошо, квест, чтобы удалить все однострочные комментарии, начинающиеся как минимум с двух слешей.Неважно, какие буквы / цифры / знаки следуют, замените его ничем.Единственное исключение - http (s): //, который следует пропустить.Примеры и результаты:
$ a = 5;// первый комментарий
$ a = 5;

$ b = 10;////// второй комментарий
$ b = 10;

$ c = 15;/// / * & / $% § $% & / & третий комментарий
$ c = 15;

/////////////////////////////
должна быть пустая строка

/ * тестовый комментарий * /
/ * тестовый комментарий * / -> без изменений, потому что нет двух слешей

Резюме: все после // должно быть удалено (включая два //), кроме http (s): //

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Теперь, когда вы изменили вопрос (много), вот седь, которая не должна удалять любые URL (file: // или http: // или https: // или что-нибудь: //) - она ​​игнорирует ://, но в противном случае удаляет все после двух косых черт:

sed 's|\([^:]\)//.*$|\1|'

Соответствует чему-либо, кроме : (сохранение этого символа), затем // и чего-либо до конца строки, только возвращаясначала не : символ.


sed 's|//[^/]*$||'

s поиск за //, затем все, что не является косой чертой [^/] ноль или более раз * затем конец строки $ и замените его ничем.

Если вы хотите сопоставить и удалить любой пробел перед комментарием, вы можете использовать класс символов пробела \s

sed 's|\s*//[^/]*$||'

Обратите внимание, чтоу вас не может быть косой черты внутри комментария, поскольку он будет соответствовать URL-адресам как комментариям, если только вы не распознали и не исключили URL-адреса.


На всякий случай, если вы хотите сохранить // (посколькувы говорите " удалить все ... после //" ) вы можете просто поставитьих обратно:

sed 's|//[^/]*$|//|'

Примечание. Чтобы просто удалить все комментарии PHP, следуйте этому ответу Лучший способ автоматического удаления комментариев из кода PHP

0 голосов
/ 28 октября 2018

Вы можете использовать жадный характер квантификаторов, чтобы всегда удалять только последнее вхождение

$ cat ip.txt
require_once(PATH_ROOT).'/calls/inumber.php'); //this is a comment<br>
http://foo/123 //commenting stuff
a//b/c/d 1//23/4/5 //commented

$ sed 's|\(.*\)//.*|\1|' ip.txt
require_once(PATH_ROOT).'/calls/inumber.php'); 
http://foo/123 
a//b/c/d 1//23/4/5 
  • sed позволяет использовать различных разделителей , это помогает избежатьescape //
    • [//] совпадает с [/], то есть соответствует одному /
  • \(.*\)//.* использовать группу захвата для частистрока перед последним набором //, чтобы вы могли вернуть ее в раздел замены, используя \1
...