奇数行に表示される特定の文字の後のすべてのテキストを削除する

奇数行に表示される特定の文字の後のすべてのテキストを削除する

すべての奇数行に表示される特定の文字の後のすべてのテキストを削除します。

これはsedファイルのすべての行で機能します。

sed 's/;.*//' 

すべての奇数行のみを処理するようにこのsed行をどのように編集できますか?

答え1

GNUの使用sed:

$ sed '1~2s/;.*//' file

アドレス範囲は1~2ライン 1 と一致し、その後は他のすべてのラインと一致します。一般的なケースは、first~stepマニュアルの例がすべてのsed -n 1~2p奇数行を印刷することです。

これはGNU拡張です。

以下の該当するコンテンツawk:

$ awk 'NR % 2 { sub(";.*", "") } { print }' file

またはArrowがコメントで提案したように:

$ awk -F';' 'NR % 2 { $0 = $1 } { print }' file

同じ効果がありますが、最初の項目以降のすべての内容を明示的に置き換えるのではなく、フィールド区切り文字として使用されます(フィールドを;使用)。;-F';'

答え2

この機能はすべてのsedバージョンで動作できますが、GNU sedテスト済みです。

$ cat ip.txt 
foo;bar-baz;xyz
a;b;c
good bad. hi there
d;e
cool;hot;normal

$ sed 's/;.*//;n' ip.txt 
foo
a;b;c
good bad. hi there
d;e
cool

このnコマンドは次の行を取得しますが、何も変更しません。実際には奇数行だけを変更できます。


そしてperl

perl -pe 's/;.*// if $.%2' ip.txt

ここではif $.%2、行番号が奇数の場合にのみ置換を実行する条件を追加します。

関連情報