나는 다음을 수행하기 위해 sed를 사용하고 있습니다.
- 일치 패턴(예: 로 시작하는 줄
#
) - 대체 일치(예:
#
시작 문자를 빈 문자로 대체/제거) - stdout으로 인쇄(예: 사용 중인 대로 결과 교체를 stdout으로 인쇄
-i
) #
일치 항목 제거(예: 줄 시작 부분에 문자가 포함된 전체 줄 제거)
이는 파일에서 수행되므로 플래그와 함께 사용하면 다음을 사용하지 않는 한 sed
stdout으로 출력되지 않습니다.-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
포함 .awk
inplace
-i
inplace는 각 입력 파일의 "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