Unix에서 한 줄씩 수정

Unix에서 한 줄씩 수정

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

  1. 텍스트 줄에서 문자 찾기(GREP로 가정?)
  2. 찾은 경우 줄 끝에 텍스트를 추가하십시오(SED를 사용하시겠습니까?).
  3. 찾을 수 없으면 같은 줄에서 다른 문자를 찾습니다.
  4. 발견되면 줄 끝에 텍스트를 추가하고, 그렇지 않으면 아무것도 하지 않습니다.
  5. 파일의 모든 줄을 반복합니다.

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

답변1

그게 전부입니다 sed. 추가 도구가 필요하지 않습니다.

fooa가 포함된 줄의 끝에 추가 하고 a가 포함된 줄의 끝에 추가 하고 싶다고 가정해 보겠습니다 f.barfb

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

/pattern/해당 패턴이 포함된 경우에만 다음 명령이 실행되도록 행을 "주소 지정"할 수 있습니다 . 따라서 예제에서는 f명령 그룹의 대체 및 실행을 트리거하는 줄이 포함된 줄만 적용되므로 내부의 모든 내용은 주소가 일치하는 경우에만 적용됩니다. 일치를 방지하려면 스크립트 끝으로 분기하세요.sb{}bb

분기가 없는 다른 접근 방식:

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결과를 읽고 출력합니다. -pi -e대신에 -pe( -i"in place"를 의미)를 사용하여 파일을 "편집"할 수도 있습니다 .

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

이를 수행할 수 있는 방법이 있을 수 있습니다. awk초기 테스트는 실패했지만(저는 AWK에 능숙하지 않습니다), Ruby(거의 동일해 보입니다. 예제를 원하면 알려주세요) 및 순수 Bash에서는 재미있을 수 있습니다.

관련 정보