다음 파일에서:
Lorem ipsum dolor sat amet, consectetuer adipiscing elit. Ut eu metus id lectus 전정 척골. 마에케나스 롱스.
consectetuer
전후 내용을 모두 삭제하고 싶습니다 elit
.
내가 원하는 출력:
consectetuer adipiscing elit.
어떻게 해야 하나요?
답변1
나는 sed를 사용할 것이다
sed 's/^.*\(consectetuer.*elit\).*$/\1/' file
sed s/find/replace/ 디코딩 구문:
s/^.*
-- 교체는^
줄의 시작 부분( )에서 시작되고 그 다음에는 다음 항목(.*
)이 이어집니다...\(
- 명명된 블록 시작consectetuer.*elit\.
- 첫 번째 단어와 일치하며, 마지막 단어(이 경우 후행(이스케이프) 점 포함)까지의 모든 (.*
)가 일치됩니다.\)
- 명명된 블록 끝- 다른 모든 항목(
.*
)을 줄 끝($
) 과 일치시킵니다. /
- 대체 검색 섹션 끝\1
\(
-\)
위와 위 사이의 이름 블록 으로 대체됩니다./
- 교체 끝
답변2
만약에각 라인시작 및 끝 패턴이 포함된 경우 가장 쉬운 방법은 대신 grep
.삭제각 줄의 시작과 끝 부분에는 두 패턴 사이의 내용을 간단하게 출력할 수 있습니다. 일치하는 항목만 출력하는 -o
GNU의 옵션 :grep
grep -o 'consectetuer.*elit' file
참고: 위에서 언급한 것처럼 이 방법은 파일의 모든 줄을 이 방식으로 구문 분석할 수 있는 경우에만 작동합니다. 그리고 이는 모든 일반적인 사용 사례의 80%를 차지합니다.
답변3
이 질문 제목이 왜 편집되었는지 잘 모르겠습니다."파일에서" 도착하다"줄에서OP는 여러 줄에 걸쳐 있을 가능성을 배제하지 않지만 예제에는 한 줄만 있는 것처럼 보이지만 여기서는 여러 줄 솔루션을 사용하는 것이 도움이 될 수 있습니다.
이는 교차된 선(from1
to2
이 답변은 파일에 존재하는 경우 작동합니다.):
from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
예:
[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl
home
def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl
home
def elit
[xiaobai@xiaobai tmp]$
인용하다:쉘 매개변수 확장
답변4
펄 방식. 이는 본질적으로 동일합니다.마이크 V의sed
답변:
perl -pe 's/.*(consectetuer.*elit).*./$1/' file
-p
"주어진 스크립트를 적용한 후 각 줄을 인쇄합니다 " 를 의미합니다 -e
. 는 s/foo/bar/
대체 연산자 foo
입니다 . bar
괄호는 패턴을 캡처하여 대체에 사용할 수 있도록 합니다. 첫 번째로 캡처된 패턴은 이고 $1
, 두 번째 패턴 $2
은 입니다.
consectetuer
따라서 이 명령은 ( ) .*consectetuer
이전의 모든 항목 , elit
( ) .*elit
이전의 모든 항목 , 다음 .*
줄 끝 ( ) 이전의 모든 항목을 일치시키고 이를 캡처된 패턴으로 바꿉니다.