저는 패턴을 찾고 교체하기 위해 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
설명하다
- 변경이 일어나기를 원하는 경계를 표시하십시오.
- 그런 다음 루프를 설정하고 그 안의 변경 사항을 단계별로 진행합니다.