파일의 줄 바꾸기, 인쇄 및 삭제

파일의 줄 바꾸기, 인쇄 및 삭제

나는 다음을 수행하기 위해 sed를 사용하고 있습니다.

  • 일치 패턴(예: 로 시작하는 줄 #)
  • 대체 일치(예: #시작 문자를 빈 문자로 대체/제거)
  • stdout으로 인쇄(예: 사용 중인 대로 결과 교체를 stdout으로 인쇄 -i)
  • #일치 항목 제거(예: 줄 시작 부분에 문자가 포함된 전체 줄 제거)

이는 파일에서 수행되므로 플래그와 함께 사용하면 다음을 사용하지 않는 한 sedstdout으로 출력되지 않습니다.-i장난:

sed -i -e 's/^\(#\)/\1/w /dev/stdout' -e '/^#/d' test

이름이 지정된 파일에는 test다음 샘플 콘텐츠가 포함되어 있습니다.

#this
#is
a
test

위의 내용은 모든 것에 적용됩니다.와는 별개로#교체...여기에 교체를 구현하는 것이 있습니다( 표준 출력으로 인쇄하기 전에 문자를 제거 하려고 합니다 ).

sed -i -e 's/^\(#\)//w /dev/stdout' -e '/^#/d' test

이것은 전체 줄을 인쇄하는 대신 삭제한다는 점을 \1제외 하면 위와 비슷합니다 .//#

문제는 마지막 것이 작동하지 않는다는 것입니다.삭제줄 대신 교체하고 인쇄하십시오. 첫 번째 방법은 교체를 제외한 모든 작업에 작동합니다(예: #줄 시작 부분의 기호 제거).

이것이 작동하지 않는 이유는 무엇입니까(두 번째 시도, 첫 번째 시도는 작동하지만 문자를 제거하지 않는다는 점을 제외하면 #)?

답변1

첫 번째 표현식은 s/^\(#\)//w /dev/stdout두 번째 표현식과 일치할 수 있는 모든 항목을 제거합니다./^#/d

대신 사용할 수 있습니다

sed -i -e '/^#/{s///w /dev/stdout' -e 'd}' test

전임자.

$ cat test
#this
#is
a
test

$ sed -i -e '/^#/{s///w /dev/stdout' -e 'd}' test
this
is

$ cat test
a
test

답변2

그리고 GNU awk:

awk  -i inplace '{if (/^#/) {sub(/^#/, "");arr[++i]=$0;} else print}END{for (a in arr) print arr[a]}' input

옵션 -i또는 소스 라이브러리 --include포함 .awkinplace

inplace독서 에 대하여이것그리고이것.

-iinplace는 각 입력 파일의 "in-place" 편집을 수행하는 GNU sed를 에뮬레이트하는 옵션을 확장합니다 .

if (/^#/)로 시작하는 줄이 있는지 확인합니다 #. 발견되면 빈 문자열로 sub()바꿉니다 . #이제 대체를 수행하고 $0배열을 만듭니다. arr배열이 END덩어리로 인쇄되므로 화면에 인쇄됩니다. 인쇄되는 추가 라인( main블록 단위)은 를 통해 파일로 전송됩니다 inplace.

$ awk  -i inplace '{if (/^#/) {sub(/^#/, "");arr[++i]=$0;} else print}END{for (a in arr) print arr[a]}' input
this
is

$ cat input
a
test

관련 정보