특정 범위 내의 문자열만 바꾸기

특정 범위 내의 문자열만 바꾸기

사양에파일에서 문자열을 바꾸는 방법은 무엇입니까?존재하다3. 특정 컨텍스트에서 문자열이 발견된 경우에만 교체, 다음 구조를 사용하여 파이프를 파일의 공백으로 바꾸는 것을 구현하려고 합니다.

12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]

나는 이것이 필요하다:

12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

암호:

echo "12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]" | \
 sed 's/\(START.*\)\|/ \1/g'

어떤 아이디어가 있나요?

답변1

명령의 문제점은 g플래그가 설정된 경우에도 일치시킬 텍스트의 특정 부분이 내에만 포함될 수 있다는 것입니다.하나의성냥. 욕심을 부리면 .*결국 마지막 파이프 문자만 제거하게 됩니다. 대체 텍스트의 공백이 잘못된 위치에 있다는 것은 말할 것도 없습니다.

s일치하는 항목이 없을 때까지 루프에서 명령을 반복하여 이를 수행할 수 있습니다 . 이와 같이:

sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;t looplabel'

또는 더 짧은 루프 레이블을 사용하십시오.

sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;tt'

답변2

이 특별한 경우 |공백으로 바꾸려는 모든 내용은 대문자 바로 뒤, 대문자 또는 바로 앞에 있습니다 -. 그래서 당신은 사용할 수 있습니다주위를 둘러보세요:

$ perl -ple 's/(?<=[A-Z])\|(?=[A-Z-])/ /g' file
12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

관련 정보