2016-05-23 3 views
0

Ich habe eine tnsnames.ora-Datei mit folgendem Format:Lesen Sie eine Datei in ein Array mit Carriage Return als Trennzeichen (bash)

ALIAS_NAME = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = host.mycompany.com)(PORT = 1823)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = alias_name) 
    ) 
) 

ALIAS_NAME1= 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = host.mycompany.com)(PORT = 1823)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = alias_name1) 
    ) 
) 


ALIAS_NAME2 = 
    (DESCRIPTION = 
    (LOAD_BALANCE = ON) 
    (FAILOVER = ON) 
    (ADDRESS = (PROTOCOL = TCP)(HOST = host.mycompany.com)(PORT = 1823)) 
    (ADDRESS = (PROTOCOL = TCP)(HOST = host.mycompany.com)(PORT = 1823)) 
    (CONNECT_DATA = 
     (SERVICE_NAME = ALIAS_NAME2) 
     (FAILOVER_MODE = 
     (TYPE = SELECT) 
     (METHOD = BASIC) 
     (RETRIES = 20) 
     (DELAY = 1) 
    ) 
    ) 
) 

ich alphabetisch diese Datei sortiert werden soll, basierend auf dem Namen Alias, so ich dachte, ich werde die Datei in ein Array von Zeilenumbrüchen getrennt gelesen, so dass ein Element des Arrays wie folgt aussieht:

ALIAS_NAME = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = host.mycompany.com)(PORT = 1823)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = alias_name) 
    ) 
) 

Dann werde ich auf dem Array eine Art tun. Ist das möglich? Ich habe versucht, etwas wie folgt:

IFS='\n ' read -r -a array <<< file_name 

aber es hat nicht funktioniert. Irgendwelche Vorschläge? Vielen Dank.

+1

Was hat das Sortieren einer Textdatei mit Oracle zu tun? – OldProgrammer

+0

Muss es in BASH sein? Ich kann mir einen Weg vorstellen, dies in Python zu tun, aber von ganz oben kann ich mir keine einfache Möglichkeit vorstellen, dies in BASH zu tun. – bytesized

Antwort

1

Sie benötigen die Datei Zeile für Zeile

file_name=inputFile 
current=-1 
while IFS=$'\n' read -r line || [[ $line ]]; do 
    regex='^[^ ]' 
    if [[ $line =~ $regex ]]; then 
    # if it doesn't start with a space 
    let current++ 
    fi 
    ((current >= 0)) || continue # discard garbage before the first alias 
    [[ $line ]] || continue # skip empty lines 
    array[current]=${array[current]}$'\n'$line 
done < "$file_name" 
declare -p array 

Sie lesen wird dann ein Array haben den Text enthält, die Sie wollten.

Weitere Informationen zu diesem Thema finden Sie unter http://mywiki.wooledge.org/BashFAQ/001 und http://mywiki.wooledge.org/BashFAQ/005.

Verwandte Themen