sed를 사용하여 Unix에서 텍스트 선택

sed를 사용하여 Unix에서 텍스트 선택

텍스트 파일의 특정 부분을 선택하여 다른 파일에 인쇄/저장하고 싶습니다.

특정 패턴이 일치하면 선택이 시작되고 다른 패턴이 일치하면 선택이 종료됩니다. awk 없이 이 작업을 수행해야 합니다. sed를 사용하려고 합니다.

  • 찾았으면 선택을 시작하세요.예상되는
  • 발견될 때까지실제

> |e|build_event_details_json(e) })
       expected collection contained:  [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",actual collection contained:    [{"id"=>18646

대답은

>  expected collection contained:  [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",

답변1

매우 우아하지도 않고 효율적이지도 않지만 작업을 완료합니다.

sed 's/actual/\n&/' file | sed -n '/expected/,/actual/p' | sed '$d'
       expected collection contained:  [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",

어쩌면 조금 더 나을 수도 있습니다(GNU 사용 sed):

sed -n '/expected/,$ {s/actual.*$//; p; T; q; } ' file

T명령을 사용할 수 없으면 시도해 보십시오.

sed -n '/expected/,$ {s/actual.*$//; p; tL; b; :L; q; } ' file

답변2

그냥 sed를 사용하세요:

<infile sed 's/expected/\n&/;s/.*\n//;s/actual/\n&/;s/\nactual.*//'

설명하다:

  • s/expected/\n&/앞에 줄바꿈(구분)을 넣으세요 expected.
  • s/.*\n//이전 명령으로 생성된 안내선을 삭제합니다.
  • s/actual/\n&/앞에 줄바꿈(구분)을 넣으세요 actual.
  • s/\nactual.*//로 시작하는 위에서 생성된 줄을 삭제합니다 actual.

actual위의 내용은 줄의 시작 부분에 있으면 빈 줄을 생성합니다. 빈 줄을 피하려면 다음을 사용하세요.

<infile sed 's/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'

또한 위 명령은 일치하거나 일치하지 않는 모든 행을 변경하지 않고 그대로 두고 인쇄된다는 점에 유의 expected하세요 actual.
이를 방지하려면 /expected\|actual/!d앞에 다음을 추가하세요.

<infile sed '/expected\|actual/!d;s/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'

필요한 것이 있다면범위expected과 사이의 줄을 actual삭제하고 포함된 후행 줄을 제거한 actual후 다음을 사용하세요.

<infile sed '/^expected/!{s/expected/\n&/};/^actual/!{s/actual.*/\n&/}' |  
        sed '/expected/,/actual/!d;/actual/d'

답변3

나는 이것이 다음과 같아야 한다고 생각합니다.

 sed -n '/expected.*actual/{s/actual.*//;p;n};
         /expected/,/actual/{s/actual.*//;p}' input

줄에 시작 태그와 끝 태그가 모두 포함되어 있으면 끝 태그 뒤의 모든 내용이 삭제되고 다음 줄이 읽혀집니다. 그렇지 않으면, 여는 태그와 닫는 태그를 포함하는 줄 사이에 무엇이든 인쇄하고 닫는 태그 뒤의 모든 것을 다시 삭제합니다.

답변4

sed를 사용하여 JSON을 구문 분석하려는 것 같습니다. 이는 좋은 생각이 아닙니다. 사용가능하다면.

그럼에도 불구하고 전체 파일을 메모리에 넣고 검색하고 바꿀 수 있습니다.

$ cat file
foo
bar
> |e|build_event_details_json(e) })
       expected collection contained:  [
       {"id"=>18646,
       "state"=>"available",
       "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
       actual collection contained:    [
       {"id"=>18646
baz
qux

$ sed -n 'H;${g;s/.*\(expected.*\)actual.*/\1/p}' file
expected collection contained:  [
       {"id"=>18646,
       "state"=>"available",
       "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",

부터 변경되니 참고해주세요마지막"기대한다"마지막*수량화 욕심 때문에 '실제'를 따르다

$ cat file
foo
expect1
bar
> |e|build_event_details_json(e) })
       expected collection contained:  [
       {"id"=>18646,
       "state"=>"available",
       "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
       actual collection contained:    [
       {"id"=>18646
baz
actual2
qux

$ sed -n 'H;${g;s/.*\(expected.*\)actual.*/\1/p}' file
expected collection contained:  [
       {"id"=>18646,
       "state"=>"available",
       "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
       actual collection contained:    [
       {"id"=>18646
baz

관련 정보