2016-12-09 2 views
-1

У меня есть файл input.txt в следующем формате:выборочно очистить содержимое файла PERL

DP_00296.1: 1-2, 72- 82 
DP_00575.1: 63 -68, 206 - 208 
DP_00389.1: 486-, 493-499, 529- 544 

Я хочу, чтобы очистить некоторые форматы, как: я) очистить пространство (ы), которые могли бы представить до или после "-" б) если "-" не следует любое количество, удалить, что "-"

Для вышеприведенного input.txt, я хочу окончательный output.txt быть как:

DP_00296.1: 1-2, 72-82 
DP_00575.1: 63-68, 206-208 
DP_00389.1: 486, 493-499, 529-544 

пожалуйста предложить код perl (предпочтительно один лайнер), который может выполнять работу за один раз вместо замены в regex два раза?

ps: Мои извинения за мой подход @ zdim и @ Jim Garrison .. на самом деле я ищу регулярное выражение, с которым мне удобно. Вот что я Нч пробовал:

#!/usr/bin/perl 
local $/=undef; 
open(FILE, "input.txt") || die ("Error\n"); 
$string = <FILE>; 

$string =~ s/\s//g; 
print "$string"; 

Благодарности

+3

_ «Пожалуйста, предложите код perl (желательно один вкладыш), который может выполнять работу» _ - Извините, это не так, как работает StackOverflow. Вы, как ожидается, попытаетесь решить проблему. Если вы столкнулись с трудностями, напишите, что вы написали, и объясните, что не работает. –

+0

_Пожалуйста, покажите нам, что вы делаете. Тогда все изменилось. – zdim

+0

@zdim .. Я отредактировал свой вопрос –

ответ

1

В каждой строке, захватить цифры и оценить простое условие в замене части

С /e модификатором замена части оценивается, как код. См. Его in perlop и in perlretut.

Нам нужен * квантор во втором номере для матча , чтобы замена была выполнена. Проблема указывает, что может отсутствовать только второе число, в то время как оно также допускает существование единственного числа без тире, поэтому первое число имеет +.

-p устанавливает петлю через вход, устанавливает $_ в текущую строку и печатает ее после обработки.

+0

, должен ли он быть изменен для запуска в машине Windows? –

+0

@ J.Carter Huh ... не уверен. Нет ничего системного, но я никогда не запускал однострочный шрифт в Windows, поэтому я не могу сказать. – zdim

+0

ОК .. я проверю .. но в linux тоже .. он удаляет символ третьей строки «486-», а на выходе он дает только «,» –

2

Попытка сделать это как один вкладыш, вероятно, больше проблем, чем того стоит. Разберите его, очистите, соберите и распечатайте снова.

Ваш основной формат линии довольно прост:

key: value, value, value, ... 

Во-первых, разделить ключ от значений на :.

my($key, $value) = split /:/, $line; 

Затем разделите значения на запятую.

my @values = split /,/, $value; 

Теперь вы можете не спеша вычеркивать пробелы из каждого значения.

# This works because $_ in a for loop is an alias, not a copy 
s/\s+//g for @values; 

И снова соберите линию снова.

say "$key: ".join(", ", @values); 
Смежные вопросы