Переименование содержимого текстового файла с использованием регулярных выражений - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть текстовый файл с несколькими строками в следующем формате:

gatename #outputs #inputs list_of_inputs_separated_by_spaces * gate_id

example: 
nand 3 2 10 11 * G0 (The two inputs to the nand gate are 10 and 11)
or 2 1 10 * G1 (The only input to the or gate is gate 10)

Что мне нужно сделать, так это переименовать содержимое, чтобы я исключил столбец #outputs так, чтобы конечный результат был:

gatename #outputs list_of_inputs_separated_by_spaces * gate_id
nand 2 10 11 * G0
or 1 10 * G1

Я попытался использовать функцию поиска и замены Eclipse (параметр find был оператором регулярного выражения, который не работал), но в итоге он испортил имя входа. Я рассматриваю возможность использования скрипта Python и итерации по каждой строке текстового файла. мне нужна помощь в определении того, что является подходящим выражением регулярного выражения.

Ответы [ 5 ]

4 голосов
/ 22 сентября 2009

Это в основном то, для чего предназначена утилита cut:

cut -d " " -f 1,3-

(обновление: я забыл опцию -f, извините.)

Он принимает файл, рассматривает поля, разделенные пробелами, и выводит первое, третье и последующие поля.

(Если вы используете Windows, у вас должны быть эти утилиты в стиле Unix , в любом случае, они могут быть невероятно полезны.)

Используя регулярное выражение, вы можете заменить (\w+) \d+ (.*) на $1 $2. Что-то вроде:

sed -r -e "s/([^ ]+) [0-9]+ (.*)/\1 \2/" file

или

perl -p -e "s/(\w+) \d+ (.*)/\1 $2/" file
2 голосов
/ 22 сентября 2009

Что-то вроде ...:

for theline in fileinput.input(inplace=1):
  print re.sub(r'(\w+\s*+)\d+\s+(.*)', r'\1\2', theline),

... должен соответствовать вашим потребностям.

1 голос
/ 22 сентября 2009

Вы действительно можете использовать функцию поиска и замены Eclipse, используя следующее:

Find: ^([a-z]+) \d
Replace with: \1

По сути, это совпадает с именем шлюза в начале каждой строки (^([a-z]+)), за которым следует вывод (\d), и заменяет его только совпадающим именем шлюза (\1).

1 голос
/ 22 сентября 2009

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

Просто переберите файл, разделите символ "", затем просто пропустите вторую запись.

0 голосов
/ 22 сентября 2009

Я не знаю, на какой платформе вы используете Eclipse, но если это Linux или у вас Cygwin, резать очень быстро!

cut -d" " --complement -f2 $FILE

Это будет использовать пробел в качестве разделителя и выбрать дополнение второго поля.

Если вы действительно хотите использовать регулярное выражение, вы можете сделать что-то вроде этого:

sed -r 's/^ *([^ ]+) +[^ ]+ +(.+)/\1 \2/' $FILE

Конечно, вы можете легко использовать одно и то же выражение в python или perl, но Митчел прав - расщепление легко. (Если текст не слишком длинный, и это не будет тратить время на ненужное разбиение других полей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...