사양에파일에서 문자열을 바꾸는 방법은 무엇입니까?존재하다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]