ファイル内のすべての空行を削除しようとしていますが、空でない各行の後に「\ n」を保持したいと思います。
問題:CLIで使用するとコマンドは正常に機能しますが、bashスクリプトでコマンドを使用するたびにすべての「\ n」が削除されるため、すべての結果を別々の行に置くのではなく1行に入れます。
これは私のコードです。
#printing second and third word from every line and remove lines that do not contain any digits
result=$(cat "$output_file" | awk '{print $2" "$3}' | sed 's/[^0-9]*/\\n/')
echo -e ""$result"" > "$output_file"
#getting rid of all empty lines but what happens is that the whole file becomes one line
no_empty_lines=$(cat "$output_file" | awk NF)
echo -e ""$no_empty_lines"" > "$output_file"
編集するファイル:
>135.121.62.246 7.4 >135.121.160.65 7.8 >135.121.106.56 7.5 > > >135.121.106.96 6.2 > > >135.121.160.106 10 > >135.121.90.46 コマンド失敗
要求された結果:
編集するファイル:
>135.121.46.246 7.4 >135.121.106.46 7.8 >135.121.106.56 7.5 >135.121.106.96 6.2 >135.121.160.16 10 >135.121.90.46 コマンド失敗
ベストアンサー1
1つ以上の文字を含む行を一致させることができます。
grep . {file}
関連ファイルを置き換えるコードに入れます。一時ファイルを作成して作成が成功したら、元のファイルを一時ファイルに置き換えます。最後に、元のファイルが正常に置き換えられなかった場合は、一時ファイルを削除します。
file=some_file.txt
grep . "$file" >"$file.tmp.$$" && mv -f "$file.tmp.$$" "$file"
rm -f "$file.tmp.$$"
ところで、これが元のコードで改行文字が失われる理由です。
result=$(cat "$output_file" | awk '{print $2" "$3}' | sed 's/[^0-9]*/\\n/') echo -e ""$result"" > "$output_file"
変数$result
に改行を含むテキストが正しく含まれています。 (これは非効率的な生産ラインですが、作業中は問題を無視します。)
ところで、このecho
行が本当に変です。あなたがそこにいる理由を理解できません""
。長さ0の引用符で囲まれた文字列を表し、次のように効果的に削除できます。
echo -e $result > "$output_file"
その後、シェルは内容を評価し、$result
スペース文字列を単一のスペースに変換します。この場合、タブ改行文字空白として扱われます。 (hello whole\nworld
で読んでくださいhello whole world
。)
変数を二重引用符で囲むと、この問題は発生しません。
echo -e "$result" > "$output_file"