Обнаружена ошибка в сценарии

Исходя из желаемого результата, я предполагаю, что вы просто хотите, чтобы оба файла были объединены только с уникальными строками.

В этом случае cat, sortи uniqмогут сделать это за вас:

cat a.txt b.txt | sort | uniq > c.txt

catоткрывает содержимое обоих файлов

sortсортирует вывод в алфавитном порядке

uniqперечисляет только уникальные строки

> c.txtпомещает весь вывод в новый файлc.txt

0
30.05.2021, 09:46
1 ответ

Вы экранируете \ в регулярном выражении grep. то есть ваш \\/означает буквальную обратную косую черту, за которой следует косая черта, а \\Kозначает буквальную обратную косую черту, за которой следует заглавная К.

Кроме того, /даже не нужно экранировать с помощью grep-, что необходимо только при использовании /в качестве разделителя регулярных выражений, как по умолчанию с sedили perl(, и, как правило, это лучше просто использовать другой разделитель -, например ,или :, или=).

Вместо этого используйте просто un -escaped /и \K. Например:

#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g')
echo "$ARTIST"

Пример вывода:

$./test.sh https://nothing.bandcamp.com/music   
Nothing.Bandcamp

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g'
Nothing.Bandcamp

Примечание. :Это верно как при запуске из командной строки, так и при запуске в сценарии.

напр. следующее производит нет вывода , так же, как в скрипте:

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"
2
28.07.2021, 11:28

Теги

Похожие вопросы