以下の内容を含む「file1.txt」というファイルがあります。
bibi.toto
jaja.bubu
vrtegbvtr.rvgtbtdtbvtd
次のようにvarコンテンツ(file1.txt行を含む)でいくつかのテキストをエコーしたいと思います。
var=$(cat file1.txt)
echo 'hello there is $var' > final.sh
ついに得た:
final.sh content:
hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd
スクリプトはBusiness Boxアプレット(awk、grep、sed、cat...)を使用する必要があります。
-----------------------------
最初にechoコマンドを試してみましたが、次のような結果が出ました。 hello二重引用符(")を使用しても、{}ではなく$ varがあり、テキストに 'と"があるため、二重引用符を使用してファイルに内容をエコーすることはできません。シンボル。
私も次のようにsedを試しました。
var=$(cat file1.txt)
final.sh content:
hello there is pattern
sed "s/pattern/$var/g" final.sh
しかし、私は次のようになります。
答え1
努力する:
sed 's/^/hello there is /' file1.txt > final.sh
または変数を使用する必要がある場合:
printf '%s\n' "$var" | sed 's/^/hello there is /' > final.sh
空の行を失っても問題ない場合は、次のようにすることもできます。
IFS='
' # split on newline
set -o noglob # disable glob
printf 'hello there is %s\n' $var > final.sh # invoke split+glob
実際の質問の場合:
sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt |
sqlite "$PLAY_DB_DIR/library.db"
(ファイルのエントリに'
sqliteまたは他の特殊バイトシーケンスが含まれていないと仮定します。これを保証できない場合は、せいぜいsqlite注入の脆弱性のみです。)
または、後で実行するシェルコードを出力する必要がある場合:
{
echo 'sqlite "$PLAY_DB_DIR/library.db" << "EOF"'
sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt
echo EOF
} > final.sh
あなたのサンプルは以下を提供します。
sqlite "$PLAY_DB_DIR/library.db" << "EOF"
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'bibi.toto';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'jaja.bubu';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'vrtegbvtr.rvgtbtdtbvtd';
EOF
またはあなたが持つクエリごとに1つのコマンドを実行しますsqlite
。
repl=$(cat << "EOF"
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\\''u-wl'\\'' where doc_id = '\\''&'\\'';'
EOF
)
sed "s@.*@$repl@" < file1.txt > final.sh
(今回はsqlite注入の脆弱性に加えて、ファイルに一重引用符文字が含まれる可能性がある場合は、任意のコマンド実行の脆弱性になります。)
サンプルでは、以下を提供します。
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''bibi.toto'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''jaja.bubu'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''vrtegbvtr.rvgtbtdtbvtd'\'';'
答え2
どうですか?
$ readarray -t X <file
$ IFS=$'\n'
$ echo "${X[*]/#/hello there is }"
hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd
答え3
例1:
for i in $(cat file.txt); echo "こんにちは、$iは完了しました。"
こんにちはビビトトです。
こんにちはjaja.bubuです
こんにちはvrtegbvtr.rvgtbtdtbvtdです。
これはfor!ループの例です。
例2:
Linhaを読むときにecho "こんにちは、$linhaがあります。" < file.txt
こんにちはビビトトです。
こんにちはjaja.bubuです
こんにちはvrtegbvtr.rvgtbtdtbvtdです
したがって、file.txt ファイルの各行を取得します。
答え4
助けてくださった皆さんに感謝します。特に@Stéphane Chazelasと@noobに感謝します。私の問題は、Stéphaneのコマンドはデフォルトで動作しますが、スクリプトが機能する必要があるシェルが非常に奇妙であると結論付けることができます(EOFの問題)。
愚かなノルムの最初のコマンドの例は少し簡単なので動作します。私は次のように変数を使用します。
for i in $(cat $file1); do echo "text blabla $i blabla" >> $file2; done
もう一度ありがとうございます。