次の内容を含む .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
- 必要な形式で文字列を印刷します。
$_
これらはそれぞれ入力の変数と処理形式です。