Удалить определенные символы в имени файла

Есть ли простое решение, как обрезать суффикс в моем имени файла? Проблема в том, что длина моего суффикса различна. Только та же строка в имени файла - _L001.

Смотрите пример:

NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3

Мне нужно вывести все до _L001:

NAME-code_code2
NAME-code
NAME-code_code2_code3

Я думал сделать что-то вроде этого (когда суффикс фиксированной длины):

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

Но, конечно, длина моего суффикса может быть разной. Есть ли решение для bash или awk?

Спасибо.

6 ответов

Решение

Используя чистую технику манипуляции:

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

Для всех строк в файле вы можете сделать то же самое, bash, прочитав файл в памяти и выполнив извлечение

# 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

Вы можете записать содержимое в новый файл, изменив printf в цикле как

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

Ты можешь использовать _L001 как разделитель полей в awk и вывести первое поле:

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

NAME-code_code2
NAME-code
NAME-code_code2_code3

Вот grep Решение: Это напечатает строки от начала до _L001 виден.

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

Вы также можете использовать подстановку строк, например:

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

Я бы предложил Сед.

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

пример:

$ 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

Много способов сделать это:

# 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$>
Другие вопросы по тегам