2016-10-06 6 views
0

Gibt es eine einfache Lösung, wie Suffix in meinem Dateinamen zu trimmen? Problem ist, dass meine Suffixlänge variiert. Nur die gleiche Zeichenfolge im Dateinamen ist _L001.Entfernen Sie bestimmte Zeichen in Dateiname

Siehe Beispiel:

NAME-code_code2_L001_sufix 
NAME-code_L001_sufix_sufix2_sufix3 
NAME-code_code2_code3_L001_sufix_sufix2_sufix3 

ich alles ausgeben müssen, bevor _L001:

NAME-code_code2 
NAME-code 
NAME-code_code2_code3 

ich so etwas tun dachte (wenn Suffix ist fester Länge):

echo NAME-code_code2_L001_sufix | rev | cut -c 12- | rev 

Aber natürlich ist meine Suffixlänge unterschiedlich. Gibt es irgendeine bash oder awk Lösung?

Vielen Dank.

+0

sorry, war es Tippfehler. Ich habe es gerade bearbeitet. – Paul

Antwort

4

reine String-Manipulation Technik verwenden: -

$ string="NAME-code_code2_L001_sufix"; printf "%s\n" "${string%_L001*}" 
NAME-code_code2 

F oder alle Linien int die Datei, können Sie das gleiche tun, indem bash, indem Sie die Datei im Speicher zu lesen und die Durchführung der Extraktion

# Setting a variable to the contents of a file using 'command-substitution' 
$ mystringfile="$(<stringfile)"     

# Read the new-line de-limited string into a bash-array for per-element operation 
$ IFS=$'\n' read -d '' -ra inputArray <<< "$mystringfile" 

# Run the sub-string extraction for each entry in the array 
$ for eachString in "${inputArray[@]}"; do printf "%s\n" "${eachString%_L001*}"; done 

NAME-code_code2 
NAME-code 
NAME-code_code2_code3 

Sie können den Inhalt in eine neue Datei schreiben, indem die printf in der modifizierende als

for-Schleife Hier
printf "%s\n" "${eachString%_L001*}" >> output-file 
1

Ich würde sed vorschlagen.

sed 's|\(.*\)_L001.*|\1|' 

Beispiel:

$ for LINE in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3; do echo "$LINE"|sed 's|\(.*\)_L001.*|\1|';done 
NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
+0

Sorry, es war ein Tippfehler :-) – Paul

2

Sie können _L001 als Feldtrennzeichen in awk verwenden und erste Feld drucken:

awk -F '_L001' '{print $1}' file 

NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
1

ist grep Lösung: Dies wird Zeilen von Anfang an Druck bis _L001 zu sehen ist.

grep -oP '^.*?(?=_L001)' inputfile 
NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
1

Viele Möglichkeiten, dies zu tun:

# Here is your Input text. 
bash$> cat a.txt 
NAME-code_code2_L001_sufix 
NAME-code_L001_sufix_sufix2_sufix3 
NAME-code_code2_code3_L001_sufix_sufix2_sufix3 
bash$> 

# Desired output using perl. 
bash$> cat a.txt |perl -nle 'if (/^(.+)_L.*$/){print $1}' 
NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
bash$> 

# Desired output using sed. 
bash$> cat a.txt |sed 's#\(.*\)_L001_.*#\1#g' 
NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
bash$> 

# Desired output using cut 
bash$> cat a.txt |cut -f1 -d "L"|sed 's/_$//g' 
NAME-code_code2 
NAME-code 
NAME-code_code2_code3 
bash$> 
1

Sie auch string substitution, so etwas wie verwenden:

for i in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3 
do 
    echo ${i%_L001*} 
done 
Verwandte Themen