sed에서 q와 s 명령을 함께 사용하는 방법은 무엇입니까?

sed에서 q와 s 명령을 함께 사용하는 방법은 무엇입니까?

나는 qsed에서 명령을 사용하고( head -n처음 몇 줄만 모방하고 가져오려고 함) s/해당 줄에서만 패턴을 바꾸려고 합니다.

첫 번째 표현식을 생략하면 정확히 원하는 대로 대체가 작동하지만, 첫 번째 줄에만 대체를 적용하려고 하면 첫 번째 대체만 발생합니다. -i나중에 명령을 사용 하고 싶기 때문에 head 대신 sed를 사용합니다 .

sed -e '2q' -e 's/\([0-9]\{4\}[[:space:]]\)\{3\}/XXXX XXXX XXXX /g' file

답변1

표현의 순서가 중요합니다. 예는 다음과 같습니다.

cat file
a
a
a
a

< file sed '2q; s/a/b/g'
b
a

< file sed 's/a/b/g; 2q'
b
b

그러니 그만둬야 해뒤쪽에두 번째 줄을 교체했습니다. 현재는 대체 표현식을 적용하기 전에 종료합니다. 또는 구문을 선호하는 경우 -e:

< file sed -e 's/a/b/g' -e '2q'

약간 다른 상황:

처음 두 줄에만 대체 항목을 적용하고 전체 파일을 인쇄하려면 -i이 작업을 함께 수행하면 다음과 같이 할 수 있습니다.

< file sed '1,2 s/a/b/g' file
b
b
a
a

행 범위를 일치시키고 1,2해당 범위에 대해서만 다음 표현식을 실행합니다. 이 범위 내에서 작동할 표현식이 많은 경우 {}다음과 같이 포함합니다 .

< file sed '1,2{s/a/b/g; s/c/d/g;}' file

답변2

-i소프트웨어를 희생 하지 마십시오... 이는 큰 문제 가 아니며 head -n file > tmp && mv tmp filesed가 내부적으로 수행하는 작업입니다. 또한 GNU sed와 마찬가지로 -iGNU awk를 사용 -i inplace하면 일반적으로 sed로 간단한 작업을 수행하는 것보다 더 깔끔하고 쉽게 향상된 스크립트를 작성할 수 있습니다 s/old/new/.

모든 줄을 수정하고 처음 2개만 인쇄할지, 아니면 모든 줄을 인쇄하고 처음 2개만 수정하려는지 확실하지 않으므로 다음과 같은 몇 가지 가능성이 있습니다.

  1. 처음 2개의 입력 줄만 인쇄하고 수정합니다.
awk '{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX "); print} NR==2{exit}' file
  1. 모든 입력 줄을 인쇄하되 처음 두 줄만 수정하세요.
awk 'NR<=2{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX ") {print}' file

GNU와 마찬가지로 "내부" 편집을 위해 GNU awk를 사용하십시오 sed -i.

awk -i inplace '...' file

관련 정보