Unix에서 한 줄씩 수정

Unix에서 한 줄씩 수정

UNIX에서 각 LINE에 대해 파이프로 구분된 파일을 사용하여 다음을 수행하는 방법을 찾고 있는데 어디서부터 시작해야 할지 모르겠습니다.

  1. 텍스트 줄에서 문자 찾기(GREP를 사용한다고 가정하시겠습니까?)
  2. 찾은 경우 해당 줄 끝에 텍스트를 추가하십시오(SED를 사용하시겠습니까?).
  3. 찾을 수 없으면 같은 줄에서 다른 문자를 찾으십시오.
  4. 찾은 경우 줄 끝에 텍스트를 추가하고 그 외에는 아무것도 하지 않습니다.
  5. 파일의 모든 라인에 대한 루프

어떤 조언이라도 감사하겠습니다.

답변1

이것은 모두 sed작업이므로 추가 도구가 필요하지 않습니다.

foo을 포함하는 줄의 끝에 추가 f하고 가 bar없는 줄의 끝에 추가하고 싶다고 가정해 보겠습니다 f.b

sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

를 사용하여 행을 "주소 지정"할 수 있으므로 /pattern/다음 명령은 패턴이 포함된 경우에만 실행됩니다. 따라서 예제에서는 f교체 실행을 트리거하는 줄 s과 명령 b그룹 이 포함되어 {}있으므로 내부의 모든 내용은 주소가 일치하는 경우에만 적용됩니다. b스크립트 끝에 다른 문자열이 추가되는 것을 방지하기 위해 분기합니다 . 매칭 b.

분기 없이 다른 접근 방식:

sed '/f/s/$/foo/;s/^[^f]*b[^f]*$/&bar/'

연습으로서 필요한 경우 sed지식을 활용하여 스스로 이를 알아낼 수 있습니다.man sed

답변2

두 시나리오(찾을 문자: 'X' 'Y')의 줄 끝에 동일한 텍스트 문자열을 추가하려면 다음과 같이 할 수 있습니다.

sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile

반면에 문자에 따라 줄 끝에 별도의 텍스트를 배치하려면 다음을 수행할 수 있습니다.

sed -e '
   /X/s/$/__TEXT1__/; t
   /Y/s/$/__TEXT2__/
' yourfile

(테스트로 읽기) 명령을 사용하여 t이전 명령이 성공했는지 확인 s///하고 현재 줄의 sed 코드 끝으로 점프합니다. 또한 다음 구문에 유의하세요. /regex/s/// => 한 줄이 정규식으로 구성되어 있으면 해당 줄에서 대체를 수행합니다.

답변3

Perl은 모든 것을 한 번에 쉽게 할 수 있는 유용한 도구이기도 합니다.

따라서 @Philippos 예제를 사용하면 Perl 프로그램은 다음과 같습니다(일부 구문은 선택 사항이며 설명을 위해 추가되었습니다).

perl -pe '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

file결과를 읽고 출력합니다. ( "in place"를 의미) -pi -e대신을 사용하여 해당 위치에서 파일을 "편집"할 수도 있습니다 .-pe-i

perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

초기 테스트에서 실패했지만(저는 AWK에 능숙하지 않습니다) Ruby(거의 동일해 보이며 예제를 원하면 저에게 핑을 보내세요)를 사용 하여 이 작업을 수행할 수 있는 방법도 있을 수 awk있으며 순수 Bash에서는 재미있을 수 있습니다.

관련 정보