![Unix에서 한 줄씩 수정](https://rvso.com/image/112016/Unix%EC%97%90%EC%84%9C%20%ED%95%9C%20%EC%A4%84%EC%94%A9%20%EC%88%98%EC%A0%95.png)
UNIX에서 각 LINE에 대해 파이프로 구분된 파일을 사용하여 다음을 수행하는 방법을 찾고 있는데 어디서부터 시작해야 할지 모르겠습니다.
- 텍스트 줄에서 문자 찾기(GREP를 사용한다고 가정하시겠습니까?)
- 찾은 경우 해당 줄 끝에 텍스트를 추가하십시오(SED를 사용하시겠습니까?).
- 찾을 수 없으면 같은 줄에서 다른 문자를 찾으십시오.
- 찾은 경우 줄 끝에 텍스트를 추가하고 그 외에는 아무것도 하지 않습니다.
- 파일의 모든 라인에 대한 루프
어떤 조언이라도 감사하겠습니다.
답변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에서는 재미있을 수 있습니다.