удалить строку между двумя символами с помощью sed - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть файл этого типа:

16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4

и я хочу удалить все строки в квадратных скобках, чтобы получить

16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4

Я пытаюсь с помощью sed таким образом:

sed 's/\[.*]//g' file1 > file2

но я получаю

16:00 1.57 4

и с

sed 's/\[.[1234567890]]//g' file1 > file2

не работает, если строка содержит более 2 цифр.

как я могу это сделать?

Ответы [ 6 ]

1 голос
/ 11 февраля 2012

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

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

sed 's/\[[^]]*\]//g'

Я не уверен, что в sed есть нежадные квантификаторы, но в perl есть:

perl -lpwe 's/\[.*?\]//g'
1 голос
/ 09 февраля 2012

ваш шаблон допускает только один символ, добавление звезды за шаблоном расширяет его до всех соответствующих символов.

sed 's/\[.[1234567890]]*//g' file1 > file2

альтернатива:

sed 's/\[^\]*//g' file1 > file2

, что означает: после запуска "["все, кроме"] "в порядке, и это для стольких символов, сколько есть (" * ")

для дальнейшего чтения в sed: http://www.grymoire.com/Unix/Sed.html

0 голосов
/ 09 февраля 2012

Это может работать для вас:

echo "16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4" |
sed 's/\[[^]]*\]//g'
16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4
0 голосов
/ 09 февраля 2012

с использованием awk:

$ echo '16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4' | awk -F '\[[0-9]*\]' '$1=$1'
16:00  Al-Najma - Al-Rifaa  5.06  3.55  1.57 4
0 голосов
/ 09 февраля 2012

Вы уже получили ответ sed, поэтому я добавлю другой, используя awk:

awk '
  BEGIN { 
    FS = "\\[[^]]*\\]"; 
    OFS = " " 
  } 
  { 
    for (i=1; i<=NF; i++) 
      printf "%s", $i 
  } 
  END { 
    printf "\n" 
  }
' <<<"16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4"

Выход:

16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4
0 голосов
/ 09 февраля 2012

Помогает ли выход из закрытия?

sed 's/\[.*\]//g' file1 > file2
...