2012-05-12 2 views
-4

Я - лингвист (пытаюсь извлечь данные из латинского языка), но довольно новичок в программировании.Найти, скопировать и заменить с помощью регулярного выражения или другого?

У меня есть файл представляет, как это:

cerycium:cerycia 
cessatio:cessatio 
    cessatione 
cessicius:cessicia 
cessio:cessio 
    cessione 
    cessionem 
    cessioni 

и мне нужно организованы следующим образом:

cerycium:cerycia 
cessatio:cessatio 
cessatio:cessatione 
cessicius:cessicia 
cessio:cessio 
cessio:cessione 
cessio:cessionem 
cessio:cessioni 

Может кто любезно предложить scipt (Баш, регулярное выражение, Python, что угодно), что может сделать это для меня? Спасибо!

+1

ли отступы сделаны из пробелов или табуляций? Является ли он последовательным во всем? – DerfK

+5

[Переполнение стека не является вашим личным помощником по исследованиям] (http://meta.stackexchange.com/a/128553). Вы должны хотя бы сделать некоторые усилия токена в направлении решения своей проблемы. –

ответ

0

питон: Если первая строка имеет оба поля

with open('in.txt') as f: 
    lines=f.readlines() 
for i,x in enumerate(lines): 
    if ':' in x: 
     lines[i]=x.strip() 
    else: 
     lines[i]=lines[i-1].split(':')[0]+':'+x.strip() 

print("\n".join(lines)) 

выход:

cerycium:cerycia 
    cessatio:cessatio 
    cessatio:cessatione 
    cessicius:cessicia 
    cessio:cessio 
    cessio:cessione 
    cessio:cessionem 
    cessio:cessioni 
1
awk 'BEGIN {FS = OFS = ":"} NF == 1 {gsub(/[[:space:]]/, ""); $2 = $1; $1 = root} {root = $1; print}' inputfile 

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

0

Попробуйте это в Perl: Имя файла: process.pl

#!/bin/perl 

use strict; 
use warnings; 

open (READ_FILE, "infile"); 
my @fcontent = <READ_FILE>; 
close (READ_FILE); 

our $prefix = ""; 
foreach(@fcontent) { 
    if(grep(/:/, $_)) { 
     my @tokens = split(":", $_); 
     $prefix = $tokens[0]; 
    } else { 
     $_ =~ s/\s+//; 
     $_= "$prefix:$_"; 
    } 
    print $_; 
} 

open (WRITE_FILE, ">outfile"); 
foreach(@fcontent) { 
    print WRITE_FILE $_; 
} 
close (WRITE_FILE); 

В командной строке:

perl process.pl 

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

1

упрощенная версия Денниса сценария:

awk -F: 'NF==2 {root=$1; print $1":"$2;} NF==1 {gsub(/\s+/,""); print root":"$1;}' a.txt 

или с совпадающими вместо подсчета:

awk -F: '/:/ {root=$1; print $1":"$2;} /^\s+/ {gsub(/\s+/,"");print root":"$1;}' a.txt 
Смежные вопросы