나는 q
sed에서 명령을 사용하고( 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 file
sed가 내부적으로 수행하는 작업입니다. 또한 GNU sed와 마찬가지로 -i
GNU awk를 사용 -i inplace
하면 일반적으로 sed로 간단한 작업을 수행하는 것보다 더 깔끔하고 쉽게 향상된 스크립트를 작성할 수 있습니다 s/old/new/
.
모든 줄을 수정하고 처음 2개만 인쇄할지, 아니면 모든 줄을 인쇄하고 처음 2개만 수정하려는지 확실하지 않으므로 다음과 같은 몇 가지 가능성이 있습니다.
- 처음 2개의 입력 줄만 인쇄하고 수정합니다.
awk '{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX "); print} NR==2{exit}' file
- 모든 입력 줄을 인쇄하되 처음 두 줄만 수정하세요.
awk 'NR<=2{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX ") {print}' file
GNU와 마찬가지로 "내부" 편집을 위해 GNU awk를 사용하십시오 sed -i
.
awk -i inplace '...' file