0

bash スクリプトでは、配列をループして毎回 sed コマンドを実行したいと考えています。基本的に、私はそのようなことをしたいと思います:

names=( "ピーター" "フアン カルロス" "エミリー")  

${names[*]} の名前     
行う    
  sed 's/[[:space:]]*{'"$name"'}/'"$name"'/g' "$file"
終わり

何が恋しいですか?

編集:私は自分の意図をさらに説明します:

私のソースは、次のような行を含む tex ドキュメントです。

\begin{cue}
    {Peter}           
    {You won !}
\end{cue}
\begin{cue}
    {Juan Carlos}           
    {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae ipsum hendrerit, gravida est eget, tincidunt sem. Maecenas dapibus nibh commodo, pulvinar lorem at, egestas leo.}
\end{cue}

では、.csv ドキュメントを次のようにフォーマットしたいと思います。

"ピーター";"あなたが勝った!
"Juan Carlos";"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae ipsum hendrerit, gravida est eget, tincidunt sem. Maecenas dapibus nibh commodo, pulvinar lorem at, egestas leo."

ご回答ありがとうございます。

4

3 に答える 3

1

あなたが何をしているのか完全にはわかりませんが、いくつかの診断情報が役立つかもしれません. スクリプトを試してみると:

names=( "Peter" "Juan Carlos" "Emily")
file=test.txt

for name in ${names[*]}     
do    
  echo ">>" $name
  sed 's/[[:space:]]*{'"$name"'}/'"$name"'/g' "$file"
done

...ファイル上test.txt

    Peter
Carlos
Simon

...出力が得られます:

>> Peter
    Peter
Carlos
Simon
>> Juan
    Peter
Carlos
Simon
>> Carlos
    Peter
Carlos
Simon
>> Emily
    Peter
Carlos
Simon

...これは、スクリプトが の単語ごとに 1 回ループしていることを示していますnames。それがあなたの意図ですか?

あなたが探していると思うのはこれです:

names=( "Peter|Juan Carlos|Emily")
file=test.txt
IFS="|"
for name in ${names[*]}     
do    
  echo ">>"  $name
  sed -e"s/[[:space:]]*$name/$name/g" "$file"
done

... 次のような出力が得られます。

>> Peter
Peter
Carlos
Simon
>> Juan Carlos
    Peter
Carlos
Simon
>> Emily
    Peter
Carlos
Simon

... つまり、ループされる名前は、その名前が入力ファイルにある場合、前の空白が削除されます。

于 2013-09-01T07:17:39.130 に答える
1

おそらく、これはあなたが実際にやろうとしていることです:

#!/bin/bash

names=("Peter" "Juan Carlos" "Emily")
file="<your file's path here>"

expressions=()
template='s|[[:space:]]*{__NAME__}|__NAME__|g'

for __ in "${names[@]}"; do
    expressions+=(-e "${template//__NAME__/$__}")
done

sed "${expressions[@]}" -- "$file"  ## or sed -i ... to replace contents of file

で実行しbash script.shます。

于 2013-09-01T08:17:56.037 に答える