각 줄에 대해 파이프로 구분된 파일을 사용하여 UNIX 파일에서 다음을 수행하는 방법을 찾고 있지만 어디서부터 시작해야 할지 모르겠습니다.
- 텍스트 줄에서 문자 찾기(GREP로 가정?)
- 찾은 경우 줄 끝에 텍스트를 추가하십시오(SED를 사용하시겠습니까?).
- 찾을 수 없으면 같은 줄에서 다른 문자를 찾습니다.
- 발견되면 줄 끝에 텍스트를 추가하고, 그렇지 않으면 아무것도 하지 않습니다.
- 파일의 모든 줄을 반복합니다.
어떤 조언이라도 대단히 감사하겠습니다.
답변1
그게 전부입니다 sed
. 추가 도구가 필요하지 않습니다.
foo
a가 포함된 줄의 끝에 추가 하고 a가 포함된 줄의 끝에 추가 하고 싶다고 가정해 보겠습니다 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
결과를 읽고 출력합니다. -pi -e
대신에 -pe
( -i
"in place"를 의미)를 사용하여 파일을 "편집"할 수도 있습니다 .
perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file
이를 수행할 수 있는 방법이 있을 수 있습니다. awk
초기 테스트는 실패했지만(저는 AWK에 능숙하지 않습니다), Ruby(거의 동일해 보입니다. 예제를 원하면 알려주세요) 및 순수 Bash에서는 재미있을 수 있습니다.