두 문자열 사이의 문자열을 제거하는 방법은 무엇입니까?

두 문자열 사이의 문자열을 제거하는 방법은 무엇입니까?

입력하다:

$ cat a.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR

산출:

$ sed 's/SOMEMAGIC//g' a.txt
FOOBAR

내 질문:그 끔찍한 "<tdalign..." 부분을 어떻게 제거할 수 있나요? 이게 나를 미치게 만들고 있어!

답변1

음, 확실히 간단합니다.

sed -i 's/<.*>//' file

여기서는 너무 많이 설명하지 않겠습니다.

  • 이것이 <우리가 일치시키려는 부분의 시작입니다
  • .*임의의 문자( .) 및 임의의 숫자( *)를 나타냅니다. 이것은 모기를 죽이는 대포이지만 비전적이지 않은 예에도 작동해야 합니다.
  • >경쟁이 끝났습니다.

실시간 방송은 다음과 같습니다.

➜  ~  cat test 
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
➜  ~  sed 's/<.*>//' test
FOOBAR

답변2

이것을 사용할 수도 있습니다.

sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file

설명하다:

^\([^<]*\)<- <시작 위치부터 0이 아닌 문자 또는 그 이상의 문자를 추출 <하고 최종적으로 추출된 문자를 그룹에 저장합니다.

.*> - 찾을 때까지 문자를 0번 이상 일치시킵니다 >.

\(.*\)$- sed가 문자를 찾으면 >마지막 문자까지의 모든 문자를 다른 그룹에 저장하기 시작합니다(>>및 사이에 문자를 저장합니다.$).

마지막으로 역참조로 sed저장된 그룹( , )만 인쇄합니다 \1.\2

예:

$ cat file.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
$ sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file.txt
FOOBAR

답변3

일방 perl통행:

$ perl -F'<.*>' -anle 'print @F' file
FOOBAR

<.*>여기서는 줄을 삭제하는 대신 정규식을 구분 기호로 사용하여 줄을 분할합니다 .

답변4

 sed -i 's/\(A\) B \(C\)/\1\2' /path/to/example.file

이렇게 하면 문자열 A와 C는 변경되지 않고 그대로 유지되고 문자열 B가 절단됩니다. 문자를 원하는 문자열/정규식으로 바꾸세요.

$ echo A B C | sed 's/\(A\) B \(C\)/\1\2'
$ AC

관련 정보