こんにちは。 1つのフォルダ内の複数のファイルの内容を変更しようとしています。編集する必要があるファイル名を格納する配列を繰り返すと、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>]+
「^
、、、、、、または いずれにも属さない1つ以上の文字」を意味することも<
ある。これはあなたが本当に欲しいものではないかもしれません:/
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>,'