2016-07-31 17 views
0

Ich habe eine Textdatei.Wie kann ich mit sed Zeilen mit eckigen Klammern löschen?

cat 3.txt 
qqq abc cdef (1234) [5689a] 
abcfde [aaaa] 
ffff [321] 

diese Datei mit Klammern Inhalt.

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 
done 

Ich möchte

qqq abc cdef (1234) [5689a]

dann diese Zeile Echo löschen. und Echo zweite Zeile. dann lösche die zweite Zeile. und echo dritte Zeile. dann lösche die dritte Zeile. aber diese Zeile mit [] .Wie kann ich sed verwenden, um diese Zeile zu löschen?

+2

Wenn Sie uns sagen können, warum Sie das tun wollen, wird es uns helfen, eine Antwort zu finden, um das zu tun, was Sie brauchen, um den richtigen Weg zu finden. Insbesondere - warum möchten Sie jeweils eine Zeile drucken, dann löschen, statt alle übereinstimmenden Zeilen zusammen zu drucken und dann alle zusammen zu löschen? Stellen Sie sich auch ein Beispiel vor, das Ihr Problem besser veranschaulicht, weil 'cat 3.txt; > 3.txt' erzeugt Ihre gewünschte Ausgabe. Ich vermute, diese Frage ist ein Beispiel für [Das XY-Problem] (http://xyproblem.info/). –

+0

Wenn du kannst, benutze 'reararray -t VAR chepner

+0

'readarray -t VAR

Antwort

3

IMHO, können Sie es nicht mit nur einem sed aber unten könnte ein Ansatz sein

$ cat 38680195 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
line with [square brackets] 
another line without brackets 
$ sed -n '/\[[^]]*\]/p' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with [square brackets] 
$ cat 38680195 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
another line without brackets 

Hinweis
Eine Sicherung der Originaldatei in 38680195.backup platziert

$ cat 38680195.backup 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
line with [square brackets] 
another line without brackets 

Bearbeiten

Ein intelligenter Ansatz

grep '\[[^]]*\]' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195 

In diesem Fall sein kann, wenn keine der Linien [] enthalten, wird nicht der sed Teil ausgeführt werden, da es logisch AND ed (siehe &&) ist.

+0

Ich möchte eine Zeile widerspiegeln und eine Zeile löschen, also muss ich Array verwenden, eine Zeile lesen und dann echo. Wenn ich 'sed -n '/ \ [[^]] * \]/p' 38680195 && sed -i.backup '/ \ [[^]] * \]/d' 38680195' verwende, ändert sich das [] im Ordner. In der nächsten Runde wird das Echo nicht korrekt angezeigt. –

+0

'Echo eine Zeile und lösche eine Zeile'? 'lösche eine Zeile' von wo? – sjsam

+0

echo erste Zeile dann löschen Sie die erste Zeile von 3.txt, dann Echo zweite Zeile löschen zweite Zeile von 3.txt. –

0

Dies ist ein weiterer Ansatz:

grep '\[' test.txt; sed "s/^.*\[\+.*$//" test.txt | grep -v '^$'; 

Die erste grep findet Zeilen mit Klammern, entfernt die zweite diese Zeilen und die letzten grep zeigt nur die Linien, die nicht leer sind (die die ohne Klammern).

Verwandte Themen