이상한 솔루션

이상한 솔루션

다음과 같은 텍스트로 가득 찬 파일이 있습니다.

CREATE TABLE `wild_adventure_game` (
  `game_instance_id` bigint(20) unsigned NOT NULL,
  `free_game_config_id` bigint(20) unsigned DEFAULT NULL,
  `respin_instance_id` bigint(20) DEFAULT NULL,
  `state` varchar(20) NOT NULL,
  `stake` decimal(11,2) NOT NULL,
  `pay_line_win` decimal(11,2) NOT NULL,
  `bonus_win` decimal(11,2) NOT NULL,
  `total_win` decimal(11,2) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1

줄 끝에 를 포함하는 쉼표가 있는 경우도 있고 ENGINE그렇지 않은 경우도 있습니다. 나는 그 쉼표를 대체(즉, 삭제)하고 싶습니다. 저의 첫 번째 순진한 시도는 다음과 같았습니다.

sed -e 's/'$) ENGINE/$) ENGINE/' < the_file

물론 이것은 효과가 없었지만 sed그것이 이루어질 수 있는 방식으로 논쟁을 벌이는 것이 가능합니까? 아니면 그렇지 않다면 아마도 awk? 최악의 경우 bash 스크립트를 작성할 수 있지만 이는 다소 투박할 것입니다.

편집하다

위에 오타가 있었습니다. 다음과 같았어야 했습니다.

sed -e 's/,$) ENGINE/$) ENGINE/' < the_file

따라서 이 예에서는 마지막 줄 바로 옆 끝에 있는 쉼표를 아무것도 없는 것으로 바꾸거나 더 일반적으로는 일부 표현식과 일치하는 줄 앞의 마지막 줄 끝에서 일부 하위 문자열을 바꾸려고 합니다. 에 대한 실패한 시도에서 sed나는 $줄의 끝을 나타내곤 했는데, sed는 줄 끝을 가로질러가 아니라 줄을 하나씩 읽기 때문에 그것이 작동하지 않는다는 것을 이미 알고 있었습니다. 그러나 그것은 내가 달성하고 싶은 것을 보여줍니다. sed.

답변1

어때?

sed '/ENGINE/ s/,$//' file

어떤 라인에 대해서도포함"ENGINE", 줄 끝에서 쉼표를 삭제합니다.

답변2

이상한 솔루션

  /^) ENGINE/ {
    sub( /,$/, "" )
    print
    next
  }

  {
    print
  }

관련 정보