다음과 같은 원하지 않는 문자로 구분된 문자열이 포함된 파일이 있습니다.
<
>
|
- <스페이스>
다음과 같습니다.
... > Test Item|Test Item ...
~ 위에...타원은 연속을 나타냅니다. 파일은 한 줄로만 구성됩니다.
문자열을 구분하는 데 단일 문자열만 사용되도록 파일을 수정하고 싶습니다.<스페이스>성격. 예를 들어:
... Test Item Test Item ...
나는 sed
이전에 시도했습니다:
sed -e 's/< >*| */|//g' filename
그러나 다음과 같은 오류 메시지가 반환되었습니다.
sed: 0602-404 Function s/< *| */|//g cannot be parsed.
무엇을 해야 할까요?
답변1
다음 방법을 시도해 보세요.
sed -e 's:<>\s\|.*:Replaced:g' filename
결과는 다음과 같습니다.
$ echo "<> |" | sed -e 's:<>\s\|.*:Replaced:g'
Replaced
그냥 제거하려면 Replaced
명령에서 해당 단어를 제거하십시오.
<
기호와 사이에 공백이 있는 경우에는 로 >
바꿔야 합니다 .<>
<\s>
질문 업데이트 후:
$ cat filename
> Test Item|Test Item
< Test Item|Test Item
$ cat filename | sed -E 's:[<>]\s(.*)\|(.*)$:\1 \2:g'
Test Item Test Item
Test Item Test Item
답변2
<> |
파일에 보관하려는 데이터에 나타날 가능성이 없는 문자가 있는 경우 가장 효율적인 해결 방법은 tr
해당 문자를 완전히 제거하는 것입니다.
tr '<>|' ' ' <infile | ###translate all delimiter chars to spaces
tr -s ' ' >outfile ###pipe results to second tr and squeeze spaces
sed
가능한그것은 당신에게도 효과가 있을 것이지만, 그렇게 한다면 거의 확실히 속도가 느려질 것입니다. \n
줄줄 구분 기호를 기반으로 하지 않는 입력 파일을 사용할 때 와 \n
줄줄로 구분된 데이터를 처리하도록 설계된 도구를 사용할 때는 주의해야 합니다.(예: sed
및 grep
)일부 구현은 버퍼 압력으로 인해 붕괴될 수 있기 때문입니다.
당신의 문제는 그렇지 않습니다(하지만)sed
그러나 잘못된 구문을 명령 으로 제출했습니다 . @Archemar는 이미 그것이 무엇인지 언급했지만 그 이유는 다음과 같습니다.
바꾸기는 sed
s///
세 가지 필드로 구성된 명령입니다.
- 명령
s
프리미티브 뒤에 구분 기호가 옵니다.(대개/
) - 정규식 패턴 필드 뒤에 동일한 구분 기호가 있음
- 필드 바꾸기 뒤에 구분 기호 및 선택적 플래그가 옵니다.
후자 둘 중 하나 또는 둘 다 다른 이유로 길이가 0일 수 있습니다 s///
.(상황에 따라 다름)허용되는 구문. 이는 sed
파서가 구분 기호에 크게 의존해야 함을 의미합니다. 명령에서 필드를 너무 많이 지정했습니다. 이는 구문 오류이므로기능을 해결할 수 없습니다..
구현이 sed
한 줄 입력을 처리할 수 있고 POSIX와 호환된다면 다음과 같이 작동합니다.
sed 'y/<>|/ /;s/ */ /g' <infile >outfile
... y
위의 기본 요소는 sed
자체 tr
음역 기능입니다.