Скажите regex выражению пропускать начало строки перед соответствием

Поскольку AMD был первым, который выпустит 64-разрядный x86 (x86-64) центральные процессоры.

архитектура AMD64 была расположена AMD с начала как эволюционный способ добавить 64-разрядные вычислительные возможности к существующей x86 архитектуре, в противоположность подходу Intel создания совершенно новой 64-разрядной архитектуры с IA-64.

Первый основанный на AMD64 процессор, Opteron, был выпущен в апреле 2003.

На самом деле в ядре 64-разрядную поддержку называют 'x86_64' для обращения к тому, что и AMD и Intel (и другие) реализуют те инструкции.

1
26.07.2013, 21:12
2 ответа

Вот решение с помощью regex с жемчугом:

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ne 'print $1 if /(\.\/.*\/)/'
./aaaa/bbbb/cccc/    

И замена:

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ple 's/(\.\/.*\/)/--/'
45mb --dddd
0
27.01.2020, 23:53
  • 1
    Спасибо за ответы, но я не думаю, что объяснил конечную цель достаточно хорошо. Я хочу работать find ./ -maxdepth 1 -type d -print0 | xargs -0 du -h --max-depth 1 | sed -e 's/[^\/]*\//--/g;' для печати иерархии dir с глубиной, представленной - для каждой подпапки и в запуске, я хочу размер dir. В данный момент находка и du распечатают то, что я хочу, и sed заменит директоров - но это также обрубает размер dir от запуска, который я хочу оставленный неповрежденный. –  Flo Woo 27.07.2013, 04:36
  • 2
    .. оказывается, что sed не поддерживает regex lookarounds так вот почему, я не мог получить его работа. Принятие ответа от Gnouc для примера жемчуга. Решение для конца было perl -ple 's/(?<=\/)[^\/]+\//--/g' еще раз спасибо –  Flo Woo 27.07.2013, 13:47

Так как Вы разъяснили то, что Вы хотели в комментарии к ответу Gnouc, вот решение:

sed 's|[^ /]*/|--|g'

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|[^ /]*/|--|g'
45mb --------dddd

Это повредится, если у Вас будет запаздывающая наклонная черта, или если filepath, Вы являетесь передающими к нему, содержит какие-либо пробелы. Было бы довольно легко написать сценарий чего-то немного более водонепроницаемого, но это включит больше, чем одна строка.


Вот одно решение с помощью групп получения:

sed -e 's|\([^ ]* \).*/\(.*\)|\1\2|'

Я использую |s как разделители, потому что затем я не должен потрудиться выходить из наклонных черт вправо (но я должен был бы выйти из любого |s в шаблоне). AFAIK sed может иметь в значительной степени любой символ как разделитель.

Первая группа получения \([^ ]* \) соответствия 'любое количество любого символа кроме пробела, сопровождаемого пробелом'. .*/ соответствия 'любое количество любых символов, сопровождаемых наклонной чертой вправо' и второй группой \(.*\) получения 'любое количество любых символов'.

Регулярные выражения Sed (и наиболее регулярные выражения) являются жадными по умолчанию, таким образом, .*/ будет соответствовать самой длинной строке, которая соответствует ее шаблону.

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb dddd

Однако это повредится, если будет запаздывающая наклонная черта:

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb 

Эта версия будет работать даже с запаздывающей наклонной чертой, но повредится, если у Вас будет больше чем один:

sed -e 's|\([^ ]* \).*/\(.\)|\1\2|'

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb dddd/
$ echo '45mb ./aaaa/bbbb/cccc/dddd//' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb /
1
27.01.2020, 23:53

Теги

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