2016-07-21 3 views
2

Ich habe eine Textdatei 3.txt, Inhalte wie dieseWie kann ich sed verwenden, um die zweite Zeile zu löschen?

123.ooo 
aaaa - bbbb ccccc, dddd dddd, eeee fff (hhhhh ii jjj) 890a fff rrr 98.jjjj.1234 
444.kkk 

3.txt in Array VAR

#!/bin/bash 
VAR=$(cat /tmp/3.txt) 
LEN=${#VAR[@]} 
for ((i=0; i<${LEN}; i++)); 
do 
    echo ${VAR[$i]} 
    sed -i -e "#"${VAR[$i]}"#d" /tmp/3.txt 
    cat /tmp/3.txt 
done 

Ich möchte echo 123.ooo dann löschen Sie die 123.ooo Linie in /tmp/3.txt dann echo aaaa - bbbb ccccc, dddd dddd, eeee fff (hhhhh ii jjj) 890a fff rrr 98.jjjj.1234 lesen und lösche diese Zeile in /tmp/3.txt aber zweite Zeile haben Platz, wie kann ich sed verwenden, um die zweite Zeile zu löschen?

Sorry über mein schlechtes Englisch. Ich möchte echo erste Zeile, dann löschen Sie die erste Zeile in der Datei. echo zweite Zeile, dann löschen Sie die zweite Zeile in der Datei. echo dritte Zeile, dann löschen Sie die dritte Zeile in der Datei.

+1

Was ist Ihr tatsächlicher Bedarf? Linien mit den Mustern '123.ooo' und' aaaa - bbbb ccccc, dddd dddd, eeee fff (hhhhh ii jjj) 890a fff rrr 98.jjjj.1234' in der Datei löschen? Ihr Skript scheint ziemlich umständlich für eine so triviale Aufgabe. Mach einfach 'sed -i.bak -e '/123.ooo/d'-e'/aaaa - bbbbcccccc, dddddddd, eeee fff (hhhhh iijjj) 890a fffrrr 98.jjjj.1234/d 'file' und damit fertig sein. – Inian

+0

Bitte bearbeiten Sie Ihre Frage, um uns ein repräsentatives Beispiel Ihrer Eingabe und der entsprechenden gewünschten Ausgabe zu zeigen. –

+0

Was ist Ihre gewünschte Ausgabe? –

Antwort

0

Nimmt man dies als eine Übung in der Verwendung von Arrays und sed:

Das Problem mit Ihrem Code ist diese Datei als ein einziger Wert in die Variable VAR gelesen wird, während Sie ein Array mit jeder Zeile als eigene erstellen möchten Array-Eintrag.

auf ein Array verwenden zuzuweisen

VAR=(...) 

die Eingabe auf Zeilenumbrüche aufgeteilt, stellen Sie die IFS Variable auf den Wert eines einzelnen Neue-Zeile.

Sie haben auch ein anderes Problem mit Ihnen sed Bearbeitungsskript. Sie scheinen # als Trennzeichen für den regulären Ausdruck zu verwenden (was eigentlich eine "sed-Adresse" ist). Wenn Sie dies tun möchten, muss der erste # escaped sein (\#). Es sind nur die Argumente für die Editierbefehle s und ysed, die jedes nicht-zeichenartige Zeichen als Trennzeichen annehmen.

#!/bin/bash 

IFS=$'\n' 
VAR=($(cat /tmp/3.txt)) 
LEN=${#VAR[@]} 
for ((i=0; i<${LEN}; i++)); 
do 
    echo ${VAR[$i]} 
    sed -i -e "\#"${VAR[$i]}"#d" /tmp/3.txt 
    cat /tmp/3.txt 
done 

Oder mit etwas Bereinigungs:

#!/bin/bash 

IFS=$'\n' 

VAR=($(</tmp/3.txt)) 
LEN=${#VAR[@]} 

for ((i = 0; i < LEN; i++)); do 
    echo ${VAR[$i]} 
    sed -i -e "\#${VAR[$i]}#d" /tmp/3.txt 
    cat /tmp/3.txt 
done 
Verwandte Themen