私はパターンを見つけて交換するために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
説明する
- 変更が発生したい境界を表示します。
- その後、ループを設定し、その中の変更を段階的に進めます。