Используя cut/awk/sed с двумя различными разделителями

FireFox 3 стар и арестован, я недавно боролся с ним в сайте, переписывают. Существует довольно много вещей HTML5/CSS3, которые полностью или правильно не реализованы. FB реализует ультрасовременные веб-технологии, такие как HTML5 и CSS3.

Я рекомендую создать из источника для получения ближе к версии около 10.0 или лучше.

2
13.04.2017, 15:36
6 ответов

Принятие Вас никогда не будет иметь больше чем одного @ символ,

sed 's/_.*@/@/' file.txt

... должен работать.

3
27.01.2020, 21:50

Не уверенный то, что Вы действительно делаете с этим, но Вашим, могло сделать это как так с sed:

$ sed 's/\(case\).*\(@test.com\)/\1\2/' 87529.txt 
case@test.com
case@test.com
case@test.com

Это эффективно обрезает все между case и @.

Можно сделать что-то похожее с awk:

$ awk -F@ '{split($1,a,"_"); print a[1]"@"$2}' 87529.txt 

Также может быть, покончили perl (подобный подходу evilsoup):

$ perl -p -e 's/_.*@/@/g' 87529.txt 

Или можно использовать perlпредварительное средство:

$ perl -p -e 's/_.*(?=@)//g' 87529.txt 

Примечание: Предвидение и lookbehind's в perl позвольте Вам включать строки в regex шаблон, которому Вы соответствуете на, не имея их быть включенными в операцию, которая будет выполнена против regex. Думайте о них как о динамических версиях каре (^) - начало строки и доллар ($) - конец строки. Это немного меньше hacky, затем имеющий необходимость добавить @ въезжайте задним ходом после удаления его.

4
27.01.2020, 21:50

Если Ваша оболочка поддерживает расширение параметра, можно сделать что-то как

while read line; do
    printf "%s\n" "${line%%_*}@${line#*@}"
done < your_file_here

Расширение ${line%%_*} удаляет крайнее левое _ и все после него, в то время как расширение ${line#*@} удаляет крайнее левое @ и все предшествующее ему.

1
27.01.2020, 21:50
  • 1
    Как отмеченный удар, параметр основанное на расширении решение может быть короче при использовании на массиве: Красивый pastebin.com/kgq89527 –  manatwork 21.08.2013, 11:25
  • 2
    @manatwork. Я сказал бы, что это заслуживает быть в собственном ответе с коротким объяснением, возможно... –  Joseph R. 21.08.2013, 11:41
  • 3
    Однако обратите внимание, что производительность будет очень плоха на больших файлах как что-либо с помощью циклов в ударе, и это предполагает, что все строки содержат один и один _ перед крайним левым (и другие обычные проблемы при использовании read с -r и без установки IFS), контроль –  Stéphane Chazelas 22.08.2013, 23:01

Если строки могут содержать больше чем один @:

sed 's/^\([^@_]*\)_[^@]*@/\1@/'

Или:

awk -F@ -vOFS=@ 'NF >= 2 {sub(/_.*/,"",$1)};1'
1
27.01.2020, 21:50

Evilsoup решение кажется, прекрасен!

Еще одно решение с помощью обоих sed и awk.

sed 's/_/ /g; s/@/ /g' file_name | awk '{ print $1"@"$NF '}

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

  • Первый шаблон sed замены "_" с пробелом.
  • Второй шаблон sed замены с пробелом. Так, теперь мы содержание файла, разделенного на несколько столбцов:

случай test.com
случай 1_2 test.com
случай 1 test.com

  • Наконец, awk просто печатает первые и последние столбцы разделенного содержания. Здесь, NF специальный символ в awk это дает количество полей подряд.
0
27.01.2020, 21:50
  • 1
    я думаю, что Вам нужны глобальные замены (т.е. s/_/ /g;...) –  Joseph R. 21.08.2013, 10:48

Вот другой gawk путь:

gawk -F_ '{if(NF>1){print $1$NF} else {print $NF}}'

Используя _ как разделитель полей, говорим мы gawk распечатать первые и последние поля, если существует больше чем одно поле и последнее поле, если существует только единственное поле.

0
27.01.2020, 21:50

Теги

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