declarative.txt
この文が宣言文であるか、ファイルに保存し、残りの文をファイルに入れてから、ファイルの末尾に行番号をothers.txt
入力することを確認したいと思います。declarative.txt
文がピリオドで終わると、「宣言的」文です。
入力ファイル($1)
this life is good.
neverthe less.
suppppppppppppppppperb.
the best coders.
everything is good?
are you okay dude?
ma man !!
これまで私のコード
#!/bin/sh
while read row
do
x=$row | grep "\.$"
y=$row | grep -v "\.$"
echo $x >> declarative.txt
echo $y >> others .txt
done < $1
cnt=`wc -l declarative.txt`
echo $cnt >> declarative.txt
ベストアンサー1
grep
入力ファイルの行をドットで終わる行とドットで終わらない行に分割するには、1行に1つの文しかないと仮定し、2つの異なる出力ファイルに保存するには、次のように2回使用できます。
grep '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt
シェルループでは、行全体を繰り返す必要はありません(実際には落胆)。テキストファイルを処理するUnixツールには既にループが組み込まれているため、たとえば、grep
入力データの各行に正規表現が順番に適用され、一致するデータが出力されます。
入力ファイルを一度だけ解析することもできますawk
。たとえば、次のようになります。
awk '/\.$/ { print >"declarative.txt"; next }
{ print >"others.txt" }' "$1"
declarative.txt
現在の行がドットで終わると、現在の行をファイルに印刷するブロックがトリガーされます。他のすべてのラインに対して別のブロックがトリガされます。
...または次のように使用するsed
:
sed -n -e '/\.$/w declarative.txt' \
-e '//!w others.txt' "$1"
現在のdeclarative.txt
行が点で終わると書かれ、others.txt
そうでなければ書かれます。空//
の式は「最後の正規表現の再利用」を意味し、空の式!
は「実行」を意味します。これ表現が一致しない場合。