分割と接続(入力ファイルからコマンドライン引数を生成)

分割と接続(入力ファイルからコマンドライン引数を生成)

書式設定された行ファイルのテキストをリンクするには:

line1
line2
...

このような結果を得る

-o line1:1 -o line2:1 ...

次のように区切り文字をリンクする方法を見つけました。

ds=`cat list.txt`
${ds//$'\n'/','}

しかし、各項目にプレフィックスを追加する方法がわかりません。

答え1

生成された文字列で何をしたいかによって異なります。これはコマンドラインオプションセットのように見えるのでutil

解決策は次のとおりです/bin/sh

#!/bin/sh

listfile=$1

set --
while IFS= read -r line; do
    set -- "$@" -o "$line:1"
done <$listfile

util "$@"

これはスクリプトのコマンドラインで提供されているファイルから読み込み、そのファイルから読み取った各行に含める場所パラメータとファイル-oから読み取った行の場所を設定しますLINE:1LINE

すべての行を読み取った後、util作成されたコマンドライン引数のリストを使用して呼び出されます。二重引用符を使用して、"$@"構成されたパラメーター・リスト内の各個々の項目が個別に引用されるようにします。

bash配列を使用して、bash私たちが作成したコマンドライン引数を保持します。

#!/bin/bash

listfile=$1

while IFS= read -r line; do
    args+=( -o "$line:1" )
done <$listfile

util "${args[@]}"

上記の両方の例では、引用が重要です。同じ事実は、個々の項目の配列(それぞれ-oLINE:1リストの項目です)。別の方法は単一文字列 -o LINE1:1 -o LINE2:1 etc.(しかしasとして使用すると引数として解釈され、としてutil "$string"使用するとトークン化とファイル名のグロービングが実行されるため、util $string機能しません。)

上記の両方のスクリプトは、次のように使用されます。

$ ./script.sh file

ここではscript.sh、実行可能なスクリプトファイル、およびfile読み取る入力ファイルの名前です。

関連:

答え2

最近のシェル(例bash:)を使って試してみてください。

mapfile -t TMP <file
TMP=(${TMP[@]/%/:1})
echo ${TMP[@]/#/-o }
-o line1:1 -o line2:1 -o line3:1

答え3

sed 's/\(.*\)/-o \1:1/' file.txt | xargs /path/to/command

交換方法sedは次のとおりです。与えられた行のテキストを「-o the_original_text:1」に置き換えます。その後、コマンドxargsは変更されたテキスト行を取得し、コマンドライン引数に合わせてリンクします。

答え4

入力ファイル:

line1
line2
line3

注文する:

perl -lpe '$\=" ";$_="-o $_:1"' input.txt

代替コマンド:

awk '{ORS=":1 ";print"-o "$0}' input.txt

出力(両方のコマンドが同じ):

-o line1:1 -o line2:1 -o line3:1 

関連情報