Текстовое форматирование - sed, awk, shell

Мне нужна помощь, пытаясь создать переменную, используя список исключений в файле.

Поэтому у меня есть файл exclude, который я использую для rsync, который выглядит так:

*.log
*.out
*.csv
logs
shared
tracing
jdk*
8.6_Code
rpsupport
dbarchive
inarchive
comms
PR116PICL
**/lost+found*/
dlxwhsr*
regression
tmp
working
investigation
Investigation
dcsserver_weblogic_
dcswebrdtEAR_weblogic_

Мне нужно создать строку, которая будет использоваться в качестве переменной для подачи в egrep -v, так что я могу использовать тот же список исключений для rsync, что и я, когда egrep -v из find -ls.

Поэтому я создал это до сих пор, чтобы удалить все «*» и «/», а затем, когда он видит определенные специальные символы, он ускользает от них:

cat exclude-list.supt | while read line
    do
    echo $line | sed 's/\*//g' | sed 's/\///g' | 's/\([.-+_]\)/\\\1/g'

То, что мне нужно, также выглядит так: и затем экспортируйте это как переменную:

SEXCLUDE_supt="\.log|\.out|\.csv|logs|shared|PR116PICL|tracing|lost\+found|jdk|8\.6\_Code|rpsupport|dbarchive|inarchive|comms|dlxwhsr|regression|tmp|working|investigation|Investigation|dcsserver\_weblogic\_|dcswebrdtEAR\_weblogic\_"

Может ли кто-нибудь помочь?

1
nl ja de

3 ответы

Несколько вопросов со следующим:

cat exclude-list.supt | while read line
    do
    echo $line | sed 's/\*//g' | sed 's/\///g' | 's/\([.-+_]\)/\\\1/g'

Sed reads files line by line so cat | while read line;do echo $line | sed is completely redundant also sed can do multiple substitutions by either passing them as a comma separated list or using the -e option so piping to sed three times is two too many. A problem with '[.-+_]' is the - is between . and + so it's interpreted as a range .-+ when using - inside a character class put it at the end beginning or end to lose this meaning like [._+-].

Гораздо лучше:

$ sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file
\.log
\.out
\.csv
logs
shared
tracing
jdk
8\.6\_Code
rpsupport
dbarchive
inarchive
comms
PR116PICL
lost\+found
dlxwhsr
regression
tmp
working
investigation
Investigation
dcsserver\_weblogic\_
dcswebrdtEAR\_weblogic\_

Теперь мы можем передать через tr '\ n' '|' , чтобы заменить строки новой строки на каналы для альтернативного варианта для egrep :

$ sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file | tr "\n" "|"
\.log|\.out|\.csv|logs|shared|tracing|jdk|8\.6\_Code|rpsupport|dbarchive|...

$ EXCLUDE=$(sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file | tr "\n" "|")

$ echo $EXCLUDE
\.log|\.out|\.csv|logs|shared|tracing|jdk|8\.6\_Code|rpsupport|dbarchive|...

Примечание. Если ваш файл заканчивается символом новой строки, вам нужно будет удалить конечный конечный | , попробуйте sed '/ \ (. * \) |/\ 1 /' .

4
добавлено
sudo_O ты легенда, это прекрасно и работает ... Я, конечно, узнал что-то или 2 здесь ... спасибо за то, что нашли время ответить и объяснить !!!
добавлено автор Cambolie, источник

Это может сработать для вас (GNU sed):

SEXCLUDE_supt=$(sed '1h;1!H;$!d;g;s/[*\/]//g;s/\([.-+_]\)/\\\1/g;s/\n/|/g' file)
2
добавлено

Это должно работать, но я думаю, что есть лучшие решения. Сначала сохраните все в массиве bash:

SEXCLUDE_supt=$( sed -e 's/\*//g' -e 's/\///g' -e 's/\([.-+_]\)/\\\1/g' exclude-list.supt)

а затем обработать его снова, чтобы заменить пробел:

SEXCLUDE_supt=$(echo $SEXCLUDE_supt |sed 's/\s/|/g')
0
добавлено
Это не отвечает на вопрос. sed '/ \ s/|/g' не делает то, что вы думаете, и вы сохранили некоторую ошибку от OP.
добавлено автор Chris Seymour, источник
Я просто понял, что вы полагаетесь на оболочку, чтобы сгладить файл, а не sed .
добавлено автор Chris Seymour, источник
Я попробовал это, и это заменило белые пробелы. Однако я не знал о позиции «-» в [.- + _].
добавлено автор lev.tuby, источник
Во всяком случае, то, что я опубликовал, дало мне точно такой же результат, как и ваш скрипт, кроме конечного трейлинг-кода | . Итак, почему код sed/\ s/|/g ' ошибочен?
добавлено автор lev.tuby, источник
хорошо, спасибо за удаление отрицательного голоса!
добавлено автор lev.tuby, источник
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru