Редактировать все строки одновременно

341
Hugo

У меня есть файл .txt почти со всеми аэропортами мира. Каждая строка представляет собой отдельный аэропорт, и линии имеют следующий формат: город, страна - название аэропорта (код аэропорта)

то есть:

Le Mans, France - Arnage (LME) Detroit, USA - Willow Run (YIP) San Francisco, USA - San Francisco International (SFO) 

(полный текст .txt находится здесь: http://snipt.org/AnT8 )

Но я хочу в этом формате: «Город, Страна - Название аэропорта (код аэропорта)» => «Код аэропорта»

(да, с кавычками, это для кодирования PHP)

то есть:

"Le Mans, France - Arnage (LME)" => "LME" "Detroit, USA - Willow Run (YIP)" => "YIP" "San Francisco, USA - San Francisco International (SFO)" => "SFO" 

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

0
`sed -i -e 's / (\ (... \)) / (\ 1)" => "\ 1" / -e' s / ^ / "/ 'file.txt` Уже слишком поздно для меня чтобы расширить это в правильный ответ с объяснением, но если кто-то хочет, они должны чувствовать себя свободно. evilsoup 11 лет назад 0
Какую ОС вы используете? terdon 11 лет назад 0
Код аэропорта выглядит как уникальный идентификатор. Вы уверены, что вместо «Код аэропорта» => «вся линия» вам не нужен? AnonymousLurker 11 лет назад 0
@terdon Я использую Mac. Hugo 11 лет назад 0
@AnonymousLurker Уверен, мне понадобится идентификатор позже. Но спасибо за предложение. :) Hugo 11 лет назад 0

4 ответа на вопрос

5
terdon

These work out of the box on Linux, OSX etc:

  1. Perl

    perl -ne 'chomp; /\((.+?)\)/; print "\"$_\" => \"$1\"\n"' list.txt 

    more Perl, this one uses magic:

    perl -ane 'print "\"@F\" => \"$F[$#F]\"\n"' a 
  2. awk/gawk

    awk -F '[()]' '' list.txt 
  3. @evilsoup's sed

    sed -e 's/(\(...\))/(\1)" => "\1"/' -e 's/^/"/' list.txt 

None of these change the original file, use -i for the Perl and sed options or redirect the output if you want to save:

command list.txt > new_list.txt 
В OS X, если вы хотите, чтобы `sed` выполнял редактирование на месте без сохранения резервной копии, синтаксис немного отличается:` sed -i '' ... `(с GNU sed, '' '` I'n' не нужно). Gordon Davisson 11 лет назад 2
@GordonDavisson вы имеете в виду, что `-i` заставляет` sed` НЕ создавать резервную копию? В любом случае, поскольку моя команда sed (evilsoup) заключена в кавычки, смысл спорный, верно? Он будет редактироваться на месте в OSX, если вы просто добавите `-i` к команде` sed` как есть? terdon 11 лет назад 0
Нет, опция `-i` запускает редактирование на месте и позволяет указать расширение для файла резервной копии, например,` sed -i.bkp ... `. Если вы хотите редактировать на месте, но * не * хотите создать резервную копию, вы указываете пустое расширение; в `-i ''` двойные кавычки - это явная пустая строка, сообщающая sed, что нет расширения для резервной копии и, следовательно, нет резервной копии. Обратите внимание, что это полностью отделено от цитирования выражения sed. Gordon Davisson 11 лет назад 0
@GordonDavisson Хорошо, понятно, спасибо. terdon 11 лет назад 0
1
slhck

You can also use a graphical text editor with multi-line editing capabilities, such as Sublime Text.

  • Select all with CmdA, then turn on line-editing mode with ShiftCmdL.
  • Go to the end of the line with Cmd and copy the airport code in the parentheses. Then wrap the line in quotes, add the => and paste the code again.
  • Press Esc to exit line-editing mode.

So basically, you can just do the same like you'd do with one line.

Для меня это самый простой ответ. Спасибо! Hugo 11 лет назад 0
0
krishnab

Emacs does have the ability to use multiple cursors. That way, you could directly edit all of the lines at the same time. The video on setting this up is on the Emacs Rocks website http://emacsrocks.com/e13.html .

0
mk117

You could copy-paste it into a spreadsheet... then split the lines into columns via delimiter... when the columns have been made as "City, Country - Airport Name (Airport code)" ... simple add another column with repeated string: => and copy the "Airport code" column to it next..

With that it could seem like this:

"City, Country - Airport Name (Airport code)" => "Airport Code"

Just copy paste all table contents into notepad or whatever text editor you have for mac... and in that edior, replace TAB with a SPACE or NOTHING, as per your code requirements..

you'll only require a spreadsheet software like MS Excel, and a text editor like notepad.. I'm a windows user, so don't know about softwares for mac...