テキストファイルの最初と最後からすべての「空白」文字を削除します(存在する場合は\ nを含む)。 (「ファイル」が大きな文字列である場合、基本的にほとんどのプログラミング言語のtrim()関数の動作を模倣しています)。
最後の改行だけでなくallスペースと改行を削除する場合は、tr
を使用できます。
tr -d '[[:space:]]' < file > file.trimmed
または、より正確には:
tr -d '\t\n ' < file > file.trimmed
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:]]*$/'
さて、シェルスクリプトではありませんが、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
ファイル全体ではなく、先頭/末尾の空白各行についてを削除したいとします。
一部の行の先頭または末尾に空白と空白行があるテストファイル:
$ 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$
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)"
残念ながら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