web-dev-qa-db-ja.com

テキストファイルの内容をトリミングするにはどうすればよいですか?

テキストファイルの最初と最後からすべての「空白」文字を削除します(存在する場合は\ nを含む)。 (「ファイル」が大きな文字列である場合、基本的にほとんどのプログラミング言語のtrim()関数の動作を模倣しています)。

2
Lawrence

最後の改行だけでなくallスペースと改行を削除する場合は、trを使用できます。

tr -d '[[:space:]]' < file > file.trimmed

または、より正確には:

tr -d '\t\n ' < file > file.trimmed
1
codeforester

awk内:

                 { isblank = 0 }
/^[[:blank:]]*$/ { isblank = 1 }

state == 0 &&  isblank { next }
state == 0 && !isblank { state = 1 }

state == 1 &&  isblank { buffer[++n] = $0 }
state == 1 && !isblank { for (i = 1; i <= n; ++i) print buffer[i]; n = 0; print }

stateはプログラムの状態を示します。state == 0の場合、プログラムは空白行を削除します。空白行とは、空の行、またはスペースまたはタブのみを含む行です(これは[[:blank:]]が一致するものです)。プログラムは、空白以外の行が見つかるまでstate == 0に留まります。これにより、ファイルの先頭がトリミングされます。

state == 1の場合、プログラムは空白行をbuffer配列に保存します。これらの空白行は、空白でない行が見つかるとすぐに出力する必要があります。空白でない行が見つからない場合、それらは破棄されます(これにより、ファイルの末尾がトリミングされます)。

全体的な効果は、ファイルの最初と最後の空白行が削除され、他の場所の空白行は保持されることです(元のファイルに空白やタブが含まれている場合は、それらも含まれます)。

テスト:

$ cat file



Three blank lines above


Two blank lines in the middle
Three blank lines below



$ awk -f trim.awk file
Three blank lines above


Two blank lines in the middle
Three blank lines below

プログラムは、最初の非空白行の先頭でも、最後の非空白行の末尾でも空白を変更しません。それが必要な場合は、

$ awk -f trim.awk file | sed -e '1s/^[[:blank:]]*//' -e '$s/[[:blank:]]*$/'
1
Kusalananda

さて、シェルスクリプトではありませんが、PHPソリューション:

スクリプト名:trimfile.php

<?php
if ( (!empty($argv[1])) && (file_exists($argv[1])) )  {
    $file_contents = file_get_contents($argv[1]);
    $new_file_contents = trim($file_contents) . "\n";
    if ($file_contents <> $new_file_contents) {
        file_put_contents($argv[1], $new_file_contents);
    }
}
?>

使用法:

$ php trimfile.php yourfile.txt
0
Lawrence

ファイル全体ではなく、先頭/末尾の空白各行についてを削除したいとします。

一部の行の先頭または末尾に空白と空白行があるテストファイル:

$ cat -e file
line 1$
  line 2$
line 3 has trailing spaces   $
$
blank line above$

そして、GNU sedコマンドでトリミングを行います

$ sed -r 's/^\s+//; s/\s+$//; /^$/d' file | cat -e
line 1$
line 2$
line 3 has trailing spaces$
blank line above$
0
glenn jackman

sedを使用:

sed -z 's/^\s*//; s/\s*$//' infile
  • s/^\s*//は、入力ファイルとしてのinfileの非常に物乞い時に空白/空行を削除します。

  • s/\s*$//infileの最後にある\nを含む入力ファイルとして、infileの最後にある空白/空行を削除しました。

cat -e infile

$
$
$
Three blank lines above$
$
$
Two blank lines in the middle$
a blank lines below$
$
a line with trailing whitespaces                $
          a line with leading whitespaces$
below are two empty lines + one whitespaces then an empty line again$
$
$
                                    $
$

出力:

Three blank lines above


Two blank lines in the middle
a blank lines below

a line with trailing whitespaces
          a line with leading whitespaces
below are two empty lines + one whitespaces then an empty line again

または、printfを使用して、最初の空白/空行を削除したsedの結果を出力し、最後の空行と\nのみを削除するコマンド置換内で使用できます。

printf '%s' "$(sed -z 's/^\s*//' infile)"
0
αғsнιη

残念ながらdebianの標準インストールには含まれていないedで試すことができます。

printf '%s\n' \
 'g/[^[:blank:]][^[:blank:]]*/kx' \
 "'"'x,$j' \
 '$s/[[:blank:]]*$//' \
 '/[^[:blank:]][^[:blank:]]*/kx' \
 '1,'"'"'xj' \
 '1s/^[[:blank:]]*//' \
 'wq' | 
ed -s infile

またはGNU sed

sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
0
ctac_