2

ファイルを1行ずつ読み取り、その行を編集して新しいファイルに入れたい:

while read my_line
do
    # doesn't handle the last OR
    printf "'%s'\$label OR " $my_line >> delivered 
done < "labels.txt"

残念ながら、このアプローチに従うことで、ファイルの最後の要素の後にも OR を追加します。

最後の行を特定することで、何らかの方法でこのケースを処理できると思いました。read が 0 と異なる場合、ファイルの終わりがあります。ただし、この場合、ループ内で使用して別の printf 命令を作成することはできません。

なにか提案を?

ありがとうございました

4

4 に答える 4

1

これを試すことができます:

while read my_line
do
  printf "'%s'"
  read -t 0 && printf " OR "
done < "labels.txt" > delivered

2 番目read( で 0 秒のタイムアウトを指定-t) は、利用可能な入力がある場合にのみ成功しますが、入力を消費しません。最後の行を印刷した後は成功しないため、末尾の「OR」を印刷しません。

于 2013-02-19T23:24:14.860 に答える
1

これに対する古典的な回避策は、0=1. それを作る'FOO' OR 'BAR' OR 0=1

{
while read my_line
do
    # doesn't handle the last OR
    printf "'%s'\$label OR " $my_line
done 
echo 0=1
} < "labels.txt" > delivered

0=1これには、空の入力ファイルを空の文字列ではなく有効な式に変換するという追加の利点があります。

于 2013-02-19T23:26:56.053 に答える
1

を使用した別の面白い解決策:

$ cat file.txt
aaa
bbb
ccc
$ perl -pe 's/.*/\047$&\047/; !eof && s/\n/\$label OR /g' file.txt
'aaa'$label OR 'bbb'$label OR 'ccc'

これには、非常に明確な構文があるという利点がありますね。

  • -peprintデフォルトで (のように)を表し、同等であるsedと仮定しますwhile (<>) {}
  • \047一重引用符の8進数表現を表します'
  • !eofを意味するif the EOF is not reached
  • s///sed のような置換の基本的なスケルトンです。
于 2013-02-19T23:37:50.443 に答える
0

headとを使用した簡単なソリューションtail

$ cat test.txt
aa
bb
cc
dd
$ head -n -1 test.txt|sed "s/$/ OR/"; tail -n 1 test.txt
aa OR
bb OR
cc OR
dd

head行数の意味で、最後の行を除いてファイルを読み取ります-1。次にsed、各行の最後にキーワードを追加します。これは$、検索式で一致します。次に、tailは最後の行を変更せずに追加します。

2つのコマンドがあるため、出力をファイルにリダイレクトするには、サブシェルで実行できます。

$ (head -n -1 test.txt|sed "s/$/ OR/"; tail -n 1 test.txt) > output
于 2013-02-20T09:38:42.753 に答える