这是我的问题,我写了下面这行代码来正确地格式化在目录中递归找到的文件列表。SED坏代替错误
find * | sed -e '/\(.*\..*\)/ !d' | sed -e "s/^.*/\${File} \${INST\_FILES} &/" | sed -e "s/\(\)\([a-zA-Z0-9]*\/\)/\/\2/" | sed -e "s/\(\/\)\([a-zA-Z0-9\_\-\(\)\{\}\$]*\.[a-zA-Z0-9]*\)/ \2/"
第二步是将此命令的输出写入脚本。虽然上面的代码具有预期的行为,但是当我尝试将其输出存储到变量时发生问题,我从行中的第一个sed命令得到了错误的替换错误。
#!/bin/bash
nsisscript=myscript.sh
FILES=*
for f in $(find $FILES); do
v=`echo $f | sed -e '/\(.*\..*\)/ !d' | sed -e "s/^.*/\${File} \${INST\_FILES} &/" | sed -e "s/\(\)\([a-zA-Z0-9]*\/\)/\/\2/" | sed -e "s/\(\/\)\([a-zA-Z0-9\_\-\(\)\{\}\$]*\.[a-zA-Z0-9]*\)/ \2/"`
sed -i.backup -e "s/\;Insert files here/$v\\n&/" $nsisscript
done
请你帮我理解两种情况之间有什么不同,以及为什么我得到这个错误?
在此先感谢!
嗯......我想我自己找到了解决方案。在分隔符里面,“$”被解释为某种原因,无论是单独还是在它之前有一个反斜杠。解决方法是在每个“$”字符前加2个反斜杠。 v ='echo $ f | sed -e'/\(.*\..*\)/!d'| sed -e“s /^.*/\\$ {File} \\ $ {INST \ _FILES}&/”..... 我很乐意听到为什么会出现这种情况, 。 – Patrick
与您的问题本身无关,但似乎您不知道可以更改sed的分隔符,因此您不必跳过斜线。只要选择另一个你不需要的字符,比如':':'sed's:pattern:substitution:',这将大大提高正则表达式在处理路径时的可读性 – carlpett