Unix bash Sed 명령이 하나의 파일에 결합됨

Unix bash Sed 명령이 하나의 파일에 결합됨

다음과 같은 원하지 않는 문자로 구분된 문자열이 포함된 파일이 있습니다.

  1. <
  2. >
  3. |
  4. <스페이스>

다음과 같습니다.

...  > 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줄줄로 구분된 데이터를 처리하도록 설계된 도구를 사용할 때는 주의해야 합니다.(예: sedgrep)일부 구현은 버퍼 압력으로 인해 붕괴될 수 있기 때문입니다.

당신의 문제는 그렇지 않습니다(하지만)sed그러나 잘못된 구문을 명령 으로 제출했습니다 . @Archemar는 이미 그것이 무엇인지 언급했지만 그 이유는 다음과 같습니다.

바꾸기는 sed s///세 가지 필드로 구성된 명령입니다.

  1. 명령 s프리미티브 뒤에 구분 기호가 옵니다.(대개 /)
  2. 정규식 패턴 필드 뒤에 동일한 구분 기호가 있음
  3. 필드 바꾸기 뒤에 구분 기호 및 선택적 플래그가 옵니다.

후자 둘 중 하나 또는 둘 다 다른 이유로 길이가 0일 수 있습니다 s///.(상황에 따라 다름)허용되는 구문. 이는 sed파서가 구분 기호에 크게 의존해야 함을 의미합니다. 명령에서 필드를 너무 많이 지정했습니다. 이는 구문 오류이므로기능을 해결할 수 없습니다..

구현이 sed한 줄 입력을 처리할 수 있고 POSIX와 호환된다면 다음과 같이 작동합니다.

sed 'y/<>|/   /;s/  */ /g' <infile >outfile

... y위의 기본 요소는 sed자체 tr음역 기능입니다.

관련 정보