Whileループは文字列を正しく解析/貼り付けることができません。

Whileループは文字列を正しく解析/貼り付けることができません。

次の内容を含む .txt ファイルがあります。

"[email protected]"

whileループを使用してこの文字列をstdoutに貼り付けて、echoが作成する必要があります。"text [email protected] text"

while read line;
do 
    echo "text $line text"
done <./textfile.txt

しかし、私が得るものは次のとおりです。text"[email protected]"

text--> スペースと次のスペースが$line失われます。

次のように変更すると

while read line;
do 
     echo "text\ $line text"
done <./textfile.txt

わかりました。text "[email protected]"

-->最初の後ろにはtextスペースがありますが、その後にスペースは[email protected]ありませんtext

答え1

~からテキスト処理にシェルループを使用することは悪い習慣と見なされます。、専用のテキスト処理ツールを使用する他のアプローチをお勧めします。特にawk私は次のことを考えました。

awk '{printf "text %s text\n",$0}' textfile.txt 

これは、Awkの組み込みprintf関数(よく知られているC関数と同じ書式設定構文を使用)を使用して、$0両端に含まれている現在の行全体(で示されている)を印刷します。text

あなたのアプローチがうまくいかない理由は次のとおりです。テキストファイルがWindowsベースのコンピュータで編集されたことを確認したので、これは行末がLinuxで正しく解釈できない形式であることを意味します。この場合、dos2unix以下のようにファイルを実行するだけです。

dos2unix textfile.txt

生成されたファイルは正しく処理する必要があります。

答え2

自分を紹介し、perl私と一緒に勉強してみてください。

perl -ne ' s/\n|"//g ; print "\"text $_ text2\"\n" ' infile.txt
  • ファイルを1行ずつ読み込む-n
  • インラインスクリプトの実行-e
  • 入力行からすべての改行と引用符を削除します。s/\n|"//g
  • 必要な形式で文字列を印刷します。
  • $_これらはそれぞれ入力の変数と処理形式です。

関連情報