SED

2012-03-02 8 views
1

で消去私は、ファイル内の行のトンを持っていると私はsedのかどうかを知りたい、この変更、それは例えば、列SED

後にあるものは何でも消去することができます:

:用

a20 is (on) Jan 15

a20 is (on)

+0

あなたはこの1の後にすべての行を削除しますか? *すべての行*をテキストで短縮しますか?またはすべての行を短縮しますか? –

答えて

3

これには複数の方法があります。あなたは括弧の後に、すべてのライン上のすべてを削除したい場合は、単に使用:

sed -i 's/).*/)/' file.txt 

は何上記されない「括弧の後にすべてのものと一致し、そしてちょうど括弧とマッチ全体を置き換えます」。

これは、最も簡単なツールは通常は正しいと言われています。 cutは、あなたがそれに渡すdelimiterに基づいて、行をブロックに「切り取る」非常に簡単な方法を提供します。例えば:あなたのファイルは少し異なっている、そして3番目の列は、必ずしも括弧で終わっていない場合

cut -d" " -f -3 file.txt 

今、あなたの代わりにawkを使用することができます。 Awkはより多くの制御を提供し、cutよりもはるかにきめ細かです。例えば

awk -F' ' '{ print $1, $2, $3 }' file.txt 

何上記行い、フィールドセパレータとして-Fで渡された文字を使用して、別のすべての行です。次に、3つの最初のフィールドを同じフィールドセパレータ(OFS)で区切って出力します。

+3

'$ 3'は' $ 1 OFS $ 2つのOFSに$ 3' –

+0

@glennjackmanのおかげでグレンを印刷するよりも、同じですが、よりエレガント、$ 1、$ 2を印刷し、私はそれに気づいていませんでした。私はそれを反映するために私の答えを編集します。 – teotwaki

1

awkたツールです非常によく表形式のデータを扱う:あなたが代わりにカットしてみてください

$ cat file.txt | tr -s ' ' | cut -d ' ' -f 1-3 
3

$ awk -v n=4 '{for(i=n;i<=NF;i++)$i=""}1' file.txt 

cutはまだ別のツール(時々、あなたがcuttrとホワイトスペースを圧迫する必要がある)です。

cut -d " " -f -3 FILENAME 
-1

はい、あなたはsedを使用することができます。

sed 's/^\([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*/\1/' file.txt > newfile.txt 

は(bashで)SEDの後に「-i」スイッチを追加して、ファイル(すなわち、入力と出力が同じである)その場で編集することになります。これをテストしている間にまずバックアップを作成します。

一部のバージョンのsedでは、構文をより使いやすくする拡張正規表現を使用できます。 "-r" スイッチを使用します。

sed -r 's/^([^ ]+ [^ ]+ [^ ]+).*/\1/' file.txt > newfile.txt 

[^ ]は、スペースを除くすべての文字を意味します。 [^ ]*スペース [^ ]+以外の任意の文字のゼロ個以上のスペース \1以外の任意の文字の1つ以上が当然の最初の括弧表現 で代替を意味し、あなたはいつも:-)代わりにカットし使用することができます意味意味:

cut -f-3 -d" " file.txt > newfile.txt 
+0

これまで見たことのある最も醜いsedコードでなければならない... o_O – Morlock

+0

@Glenn - 良いキャッチ。コードを修正しました。私はそれをテストすることができませんでした。それは醜いかもしれないが、それは質問に答える。私はほぼ確実に自分のコードでカットを使用します。 – groovyspaceman

0
前方後方作業

echo "a20 is (on) Jan 15" | sed 's/\(\s*\S*\)\{2\}$//' 
a20 is (on) 

時には簡単です、または:

これはあなたのために働くかもしれない

echo "a20 is (on) Jan 15" | sed 's/\(\S*\(\s*\S*\)\{2\}\).*/\1/' 
a20 is (on) 
0

誰も(、-iをsedのとは対照的に、sedのGNUを使用していないプラットフォーム上で動作します)perlの方法を言及していない:perl -p -i -e 's/(on).*/(on)/' filename