我需要一些帮助,尝试使用文件中的排除列表来构建变量。
所以我有一个我用于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,这样我就可以像使用find -ls中的egrep -v一样使用相同的rsync排除列表。
所以到目前为止我创建了这个以删除所有“*”和“/” - 然后当它看到某些特殊字符时它会逃脱它们:
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\_"
有人可以帮忙吗?
答案 0 :(得分: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/'
。
答案 1 :(得分:2)
这可能适合你(GNU sed):
SEXCLUDE_supt=$(sed '1h;1!H;$!d;g;s/[*\/]//g;s/\([.-+_]\)/\\\1/g;s/\n/|/g' file)
答案 2 :(得分: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')