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

하나를 선택하세요:

방법:

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

설명하다

  • 변경이 일어나기를 원하는 경계를 표시하십시오.
  • 그런 다음 루프를 설정하고 그 안의 변경 사항을 단계별로 진행합니다.

관련 정보