1

我需要一些帮助来尝试使用文件中的排除列表来构建变量。

所以我有一个用于 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 使用相同的排除列表,就像我在 find -ls 中使用 egrep -v 时所做的那样。

所以到目前为止我已经创建了这个来删除所有“*”和“/” - 然后当它看到某些特殊字符时,它会转义它们:

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\_"

任何人都可以帮忙吗?

4

3 回答 3

4

以下几个问题:

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

Sed逐行读取文件,因此cat | while read line;do echo $line | sed完全多余,也sed可以通过将它们作为逗号分隔列表传递或使用-e选项进行多次替换,因此管道到sed三次是两次太多。'[.-+_]' 的一个问题-是介于之间.+因此当在字符类中.-+使用时将其解释为一个范围,-将其放在开头或结尾以失去此含义,例如[._+-].

一个更好的方法:

$ 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 's/\(.*\)|/\1/'.

于 2013-01-29T10:01:56.717 回答
2

这可能对您有用(GNU sed):

SEXCLUDE_supt=$(sed '1h;1!H;$!d;g;s/[*\/]//g;s/\([.-+_]\)/\\\1/g;s/\n/|/g' file)
于 2013-01-29T10:30:50.160 回答
0

这应该可行,但我想有更好的解决方案。首先将所有内容存储在 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')
于 2013-01-29T10:09:40.150 回答