ファイルから空白行を切り取る(bashスクリプト)

ファイルから空白行を切り取る(bashスクリプト)

ファイル内のすべての空行を削除しようとしていますが、空でない各行の後に「\ 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"

おすすめ記事