sed를 사용하여 패턴을 일치시키고 diff 파일로 출력하는 방법

sed를 사용하여 패턴을 일치시키고 diff 파일로 출력하는 방법

다음과 같은 일반 텍스트 파일이 있습니다.

*,cli-verify-aggregation-general,./link-aggr/aggregation.xls
-,stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

"-"로 시작하는 줄만 포함하는 다른 파일이 필요합니다.

결과물 파일:

stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

"-"가 없어야 합니다.

답변1

원하는 것을 달성하는 방법에는 여러 가지가 있습니다. 입력 파일이 호출되고 input.txt출력이 출력된다고 가정하면 output.txt다음이 작동합니다.

1. awk사용방법 및cut

awk '/^-/' input.txt | cut -d "," -f 2-  > output.txt

이는 a로 시작하는 모든 줄을 awk일치시키고 일치하는 줄을 표준 출력에 인쇄하도록 지시합니다(이것은 기본 작업이므로 명시적으로 지정할 필요가 없습니다).input.txt-

이는 에 대한 입력으로 파이프되어 cut각 쉼표( )로 줄을 구분하고 다음 -d ","을 제외하고 식별된 모든 필드를 인쇄합니다.두번째( ), 제거하려는 선행을 생략합니다 -f 2-.-

그런 다음 출력이 파일로 리디렉션됩니다.

자세한 내용은 다음에서 확인할 수 있습니다.GNU Awk 사용자 가이드당신이 관심이 있다면.

2. grep사용방법 및cut

이 "간단한" 설정에서는 awk를 대신 사용할 수도 있으며 grep비슷한 효과가 있습니다.

grep "^-" input.txt | cut -d "," -f 2- > output.txt

사용할 정규식은 동일합니다. 즉, a와 일치 -하지만 해당 행의 첫 번째 문자로 나타나는 경우에만 해당됩니다(이것이 바로 위의 의미입니다 ^).

3. 사용방법sed

sed마지막으로 다음을 사용하여 이를 달성 할 수도 있습니다.

sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt

이는 sed두 가지 규칙을 사용하여 처리함을 나타냅니다.input.txt

  • 먼저 입력에서 모든 파일을 제거합니다.아니요-:first 로 시작한다는 ^것은 여전히 ​​다음이 줄의 첫 번째 문자로 나타나야 함을 의미하지만 표현에서는 [ ... ]"를 의미합니다.와는 별개로a -". 그러한 행이 발견되면 제거됩니다(걱정하지 마십시오. sed해당 옵션을 지정하지 않으면 입력 파일은 건드리지 않습니다 -i).
  • 둘째, 모든 입력 라인에서 ( s/.../.../) 선행 을 -,... 공백으로 바꾸십시오(따라서 제거하십시오).

출력이 다시 파일로 리디렉션됩니다.

@Sundeep이 지적했듯이 이는 다음을 선언하여 보다 간결한 단일 규칙으로 바뀔 수도 있습니다.

sed -n 's/^-,//p' input.txt > output.txt

sed이렇게 시작하는 모든 줄에서 선행을 제거 -,하고 일치하는 줄(후행)만 인쇄하고 p출력을 다시 파일로 리디렉션하도록 지시합니다 .노트-n소위 출력을 억제하려면 여기에서 옵션이 중요합니다.패턴 공간이는 달성하려는 목표를 방해합니다.

관련 정보