您好,我正在尝试更改文件夹中多个文件的内容。我在尝试迭代存储需要编辑的文件名称的数组时遇到 sed 错误。我尝试使用数组“ ${len_1[0]}
”的特定元素,它工作得很好。
这是我到目前为止所做的:
len_1=($(find . -name "*.dita"))
len=${#len_1[@]}
echo $len
for ((i=0; i<=len; i++)); do
apps=$(grep -Po 'appname="\K[^"]+' ${len_1[$i]}) &&
title=$(grep -Po '<title>\K[^</title>]+' ${len_1[$i]}) &&
sed -i "s/_[0-9]\+/_$apps.$title/g" ${len_1[$i]} &&
sed -i "s/id=\"[0-9]\+\"\+/id=\"$apps.$title\"/g" ${len_1[$i]};
done
如前所述
apps=$(grep -Po 'appname="\K[^"]+' ${len_1[0]}) &&
title=$(grep -Po '<title>\K[^</title>]+' ${len_1[0]}) &&
sed -i "s/_[0-9]\+/_$apps.$title/g" ${len_1[0]} &&
sed -i "s/id=\"[0-9]\+\"\+/id=\"$apps.$title\"/g" ${len_1[0]};
工作完美。
我得到的错误是:
sed: -e expression #1, char 37: unterminated `s' command
sed: -e expression #1, char 33: unterminated `s' command
sed: -e expression #1, char 36: unterminated `s' command
sed: -e expression #1, char 36: unterminated `s' command
sed: -e expression #1, char 37: unterminated `s' command
sed: -e expression #1, char 39: unterminated `s' command
sed: -e expression #1, char 34: unterminated `s' command
答案1
如果有多个匹配项,grep -o
将产生多行输出。和换行符结束sed
命令:
$ echo abcabbcd | grep -o 'ab*'
ab
abb
$ repl=$(echo abcabcd | grep -o 'ab*')
$ sed -e "s/foo/$repl/"
sed: -e expression #1, char 8: unterminated `s' command
此外,还[^</title>]+
表示“不属于^
、<
、/
、 t
、i
、l
、e
或中任何一个的一个或多个字符>
”。这可能不是您真正想要的:
$ echo '<title>abcdefgh</title>' | grep -Po '<title>\K[^</title>]+'
abcd
当分隔符只有一个字符时,您可以使用等效的方法,例如"[^"]*"
可以。但在这里类似的东西<title>\K.*?(?=</title>)'
可能会更好:
$ echo '<title>abcdefgh</title> <title>foobar</title>' | grep -Po '<title>\K.*?(?=</title>)'
abcdefgh
foobar
(虽然我会避免使用诸如\K
和 前瞻之类的技巧,并使用更简单的perl -lne 'print $1 if m,<title>(.*?)</title>,'
或后处理输出,但这是我的偏好。)