2016-08-21 2 views
1

Ich habe viele ähnliche URLs.So entfernen Sie 4 Zeichen vor einer Dateierweiterung mit Shell

<random_tex>/original/Widget-Examples-FAQ3dad.png?1437083013 

<random_tex>/original/Optimizec9cd.png?1413334050 

Ich möchte vor .png der 4 Zeichen abzustreifen die Ausgabe sollte wie etwas sein

<random_tex>/original/Widget-Examples-FAQ.png?1437083013 
<random_tex>/original/Optimize.png?1413334050 

Ich habe versucht sed mit zu ersetzen, aber war nicht in der Lage, das Muster für die exakte zu finden 4 Zeichen vor .png

sed ich versucht habe, ist: sed 's/\(.{0,3}\.\)png/\1png/'

Antwort

1

Sie können tun, POSIX-ly:

sed 's/.\{4\}\(\.png\)/\1/' 
  • .\{4\} Matches 4 Zeichen vor .png, nur in dem Ersatz .png

Hinweis verwendet, dass für mehr .png Muster, wird die erste sein, geändert.

Beispiel:

$ sed 's/.\{4\}\(\.png\)/\1/' <<<'/original/Widget-Examples-FAQ3dad.png?1437083013' 
/original/Widget-Examples-FAQ.png?1437083013 

$ sed 's/.\{4\}\(\.png\)/\1/' <<<'/original/Optimizec9cd.png?1413334050' 
/original/Optimize.png?1413334050 
+0

Vielen Dank! es funktionierte. – sam

-1

wenn "Datei" enthält alle URLs, eine pro Zeile ...

können Sie nur Erweiterungs Bash-Shell-Parameter verwenden:

cat file | while read -r line 
do 
    echo ${line/????.png/.png} 
done 

Oder gawk/awk Lösung:

gawk '{ sub(/.{4}.png/,".png",$0); print $0 }' file 
+0

Gut, aber Sie haben die Leerzeile vergessen hinzufügen!/^ $/Oder etwas. –

+0

Das Shell-Skript würde immens langsam sein und bei verschiedenen Eingabedatei-Inhalten fehlschlagen - niemals. Siehe [why-is-using-a-shell-loop-to-process-text-built-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell) -loop-to-process-text-in Betracht gezogen-bad-Praxis) und google UUOC, zitieren Shell-Variablen und globbing. Der Befehl awk ist viel besser und wird nicht fehlschlagen, es sei denn, 'png' erscheint früher in der Eingabe, aber er kann idiomatisch als einfach 'awk' geschrieben werden {sub (/. {4} \. Png /,". Png ")} 1 "Datei". –

Verwandte Themen