2016-12-02 1 views
0

Ich versuche ein Shellskript zu schreiben, das eine Datei (zB file_1_2.txt) aufnimmt und jedes "_" durch "." Ersetzt (zB file.1.2.txt). Dies ist, was ich habe, aber es gibt mir eine leere Ausgabe, wenn ich es ausführe.Shell-Skript zum Ersetzen von Zeichen?

Ich versuche, den geänderten Dateinamen in der Variablen "x" zu speichern und dann x an die Konsole auszugeben.

ich dieses Skript nenne von

./script2.sh < file_1_2.txt 
+0

Haben Sie versucht, den Abstand zwischen 'x =' und dem Rest Ihres Befehls zu entfernen? – Qeole

+0

Immer noch keine Ausgabe, wenn ich das tue. – Tremors

+0

Hmm versuchen Sie auch, das '$' in der 'read'-Zeile zu entfernen: 'read var' anstelle von' read $ var'. Das funktioniert für mich. – Qeole

Antwort

1

schreiben Es gibt zwei Probleme. Zuerst hat Ihr Code einige Fehler:

read var 
x=`echo $var | sed 's/_/\./g'` 
echo $x 

wird funktionieren. Du hattest eine extra $ in , einen Platz zu viel (wie zuvor erwähnt) und du hast das Ersatzmuster in sed gemischt (es war das Gegenteil von dem, was du wolltest).

Auch wenn Sie die _ von . im Dateinamen ersetzen möchten, sollten Sie

echo "file_1_2.txt" | ./script2.sh 

tun Wenn Sie < diese verwenden den Inhalt von `file_1_2.txt“ in das Skript lesen.

+0

Das funktioniert, um die Ausgabe "file.1.2.txt" zu bekommen die richtige Richtung, aber es ändert nicht wirklich den Dateinamen selbst. Wie würde ich diesen Teil dann machen? editieren: vergiss. Ich habs. "mv $ var $ x". Danke für Ihre Hilfe! – Tremors

+0

Noch einfacher. Benutze 'rename' oder nur spezifisch' vorname': 'rename' s /_/\./ g" * .txt'. Führen Sie es einfach im Terminal in den Ordner mit Ihren TXT-Dateien und es wird sie umbenennen. – CDe

+0

Sorry @Tremors Ich hatte nicht verstanden, dass Sie den Namen der Datei bearbeiten wollten, ich dachte, Sie wollten den Inhalt lesen. Auch sorry @CDe, ich habe meine Lösung mit 'rename' gepostet, bevor ich deinen Kommentar gesehen habe. – Qeole

1

Eine andere Lösung, mit bash nur:

$ x=file_1_2.txt; echo "${x//_/.}" 
file.1.2.txt 

(Siehe „Parameter Expansion“ in bash Manpage für Details)

Und Sie können dies auch mit rename:

$ touch file_1_2.txt 
$ ls file* 
file_1_2.txt 
$ rename 'y/_/\./' file_1_2.txt 
$ ls file* 
file.1.2.txt 
0

Threre nicht für sed wie bash müssen unterstützt variable Ersatz:

$ cat ./script2 
#!/bin/bash 
ofile=$1 
nfile=${ofile//_/./} 
echo mv "$ofile" "$nfile" 
$ ./script2 file_1_2.txt 
mv "file_1_2.txt" "file.1.2.txt" 

Dann entfernen Sie einfach echo, wenn Sie mit dem Ergebnis zufrieden sind .

Verwandte Themen