文本格式 - sed,awk,shell

时间:2013-01-29 09:17:56

标签: linux bash shell sed awk

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

所以我有一个我用于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\_"

有人可以帮忙吗?

3 个答案:

答案 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')