Зацикливание файла в bash и фильтрация для начала имени каталога - PullRequest
1 голос
/ 18 февраля 2020

Я действительно новичок в bash сценариях и пытаюсь написать bash сценарий для использования с перехватчиками subversion.

Цель состоит в том, чтобы получить список java проектов, которые были добавлены, а затем записать этот список в файл (чтобы я мог создать из него журнал изменений и отобразить его внутри приложения) вместе с другой информацией, собранной с помощью svnlook, которую я уже разработал.

С момента подрывной деятельности сам по себе не особо заботится о проектах, которые я фиксирую в eclipse, и вместо этого работает с каталогами, я должен использовать команду «svnlook change», которая выкладывает каждый файл с полным путем, который был включен в коммит.

Вот пример того, что возвращает «svnlook Change»:

U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java                                                                                                                                                                                                                                                                                                                                                                     
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java                                                                                                                                                                                                                                                                                                                                                            
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java

Теперь я не могу гарантировать, что эта структура каталогов всегда будет одинаковой, поэтому я хочу найти java Имена проектов путем фильтрации «PRJ» и «LIB», так как они всегда начинаются с этих букв, и я могу быть уверен, что это не изменится.

Итак Что я пытаюсь сделать в сценарии:

Шаг 1: Поместите вывод "svnlook change" в файл:

tempfile=/data/svn/scratch.txt
input=/data/svn/scratch2.txt
touch $tempfile
touch $input

$SVNLOOK changed -r "$REVISION" "$REPOS" >> $input 

Это работает.

Шаг 2: переберите каждую строку файла, найдите подстроку, которая представляет проект, ища «LIB» или «PRJ» в пути. Запишите это в файл. На данный момент я просто предполагаю, что существует не более 9 дочерних каталогов, и я перебираю путь по 10 раз, чтобы посмотреть каждый из них:

for i in {1..10}
do
        cat $input | cut -d "/" -f $i | grep -i -s -e PRJ -e LIB | tr [:lower:]äöü [:upper:]ÄÖÜ >> $tempfile
done

Это не работает в сценарии. Файл в /data/svn/scratch.txt всегда пуст. Когда я запускаю команду из командной строки и заменяю $ input и $ i, она работает, и все следующие команды также работают.

Шаг 3. Установите все остальные переменные. Я перебираю временный файл, отфильтровывая дубликаты и помещая запятые для их разделения:

DATE=$(date '+%d-%m-%Y')
REVISION=$($SVNLOOK youngest "$REPOS") 
CHANGEDPRJ=$(cat $tempfile | sort -u |  xargs | sed -e 's/ /, /g')
COMMENT=$($SVNLOOK log -t "$TXN" "$REPOS")

Шаг 4. Выведите эту переменную вместе с другими вещами в файл, в котором я хотел бы сохранить все:

echo "$DATE" , "$REVISION" , "$CHANGEDPRJ" , "$COMMENT" >> /data/svn/commit.log

Итак, сейчас я получаю:

17-02-2020, 571,, Очистка устаревших комментариев

Вместо:

17-02-2020, 571, LIB1, LIB2, PRJ1, Очистка устаревших комментариев

Я почти уверен, что есть очень очевидное и простое решение, чтобы заставить это работать, но я bash сценарий в первый раз сегодня, и я не могу найти в Google правильную информацию, чтобы узнать, что я делаю неправильно ... Если бы кто-то мог указать мне правильное направление, это было бы удивительно!

1 Ответ

0 голосов
/ 18 февраля 2020

Следующее:

cat <<EOF |
U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java     
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java
EOF
# remove the U<space><space>
sed 's/^U  //' |
# replace `/` with a newline
tr '/' '\n' |
# grep only lines with PRJ and LIB
grep -e 'PRJ\|LIB' |
# sort unique
sort -u |
# join elements with a comma
paste -sd,

вывод:

LIB1,LIB2,PRJ1

Итак, вы хотите:

"$SVNLOOK" changed -r "$REVISION" "$REPOS" |
sed 's/^U  //' | tr '/' '\n' | grep -e 'PRJ\|LIB' | sort -u | paste -sd,

Примечание: не забывайте указывать расширения переменных. Не touch $tempfile до touch "$tempfile".

...