sedを使用して特定のパターンを置き換え、同じ行に例外を追加する方法は?

sedを使用して特定のパターンを置き換え、同じ行に例外を追加する方法は?

私はパターンを見つけて交換するためにsedを使用しています。

私のパターンは「-」

私は次のデータを持っています

>1-2-3-4-5 29238232382083e-9  
>1-2-3-4-5    29238232382083e-9   
>1-2-3-4-5    29238232382083e-9   
>1-2-3-4-5    29238232382083e-9     

1*2*3*4*5を得るために、1-2-3-4-5の「-」を「*」に変更したいと思います。


しかし、 sed -i -e '/-/*/g に置き換えると

すべての「-」が影響を受けます。 29238232382083e-9の29238232382083e*9も同様です。

この例では、29238232382083e-9など、「e」の後にある「-」を除くすべての「-」を置き換えるにはどうすればよいですか?

答え1

sed 's/\([^e]\)-/\1*/g' /path/to/input

その声明を詳しく説明するには、次の手順を実行しますsed

  • \([^e]\)-eここでは、ハイフンが続く文字を除くすべての文字を見つけるためにグループ化を使用します。
  • \1*- ここでは、見つかった内容をそのグループに含まれる項目(たとえば、ハイフンの前のe以外の文字)に置き換え、ハイフンを置き換えるアスタリスクを表示します。

ハイフンを行の最初の文字として使用すると機能しません。これには特別なケースを追加する必要があります。

sed 's/\([^e]\)-/\1*/g;s/^-/*/' /path/to/input

これは似ていますが、行の最初の文字のハイフンをアスタリスクに置き換えます。最初の文字なので、前には来ませんe

答え2

1つを選択してください:

アッ方法:

awk '{ gsub("-","*",$1) }1' OFS='\t' file
  • gsub("-","*",$1)- すべてを最初のフィールドの内容-に置き換えます。*

真珠方法:

perl -lae '$,="\t"; $F[0] =~ y/-/*/; print @F' file
  • -a- 自動的に$_配列に分割@F

  • $,="\t"\t- (タブ)を使用したフィールドの結合

  • $F[0] =~ y/-/*/- すべてを最初のフィールド-に翻訳*$F[0]

出力(両方アッそして真珠方法):

>1*2*3*4*5  29238232382083e-9
>1*2*3*4*5  29238232382083e-9
>1*2*3*4*5  29238232382083e-9
>1*2*3*4*5  29238232382083e-9

sed方法:

sed 'h; s/ .*$//; y/-/*/;G; s/\n[^[:space:]]*//' file

出力(用sed方法):

>1*2*3*4*5 29238232382083e-9  
>1*2*3*4*5    29238232382083e-9   
>1*2*3*4*5    29238232382083e-9   
>1*2*3*4*5    29238232382083e-9

答え3

POSIX sedを使用して実行できますが、表現の単純さのためにGNU sedを使用してここに表示します。

sed -e '
   s/\S\s/&\n/;:a
   s/-\(.*\)/*\1/;ta
   s/\n//
' yourfile

結果

>1*2*3*4*5 29238232382083e*9
>1*2*3*4*5    29238232382083e*9
>1*2*3*4*5    29238232382083e*9
>1*2*3*4*5    29238232382083e*9

説明する

  • 変更が発生したい境界を表示します。
  • その後、ループを設定し、その中の変更を段階的に進めます。

関連情報