예를 들어, 다음과 같습니다.
$ cat test001.txt
this
is a
test bucket
bucket line not this one.
bucket lein endy
bucket and others endy
and
a ttest
공백을 무시하고 "bucket"으로 시작하는 줄을 "(bucket"으로 변경하려면 어떻게 해야 합니까?
지금까지 나는 다음을 가지고 있습니다 :
sed -i 's/^\sbucket/bucket(/g' test001.txt
그러나 이것은 작동하지 않습니다(변경 사항 및 오류 없음). 그런 다음 다음 줄에 대해 이 작업을 수행하고 싶습니다.반품"endy"로 끝납니다(따라서 버킷 행 3개 중 2개만).
답변1
\1
대체 용어에 역참조(예: )를 사용할 수 있습니다. 이는 \(…\)
검색 용어의 하위 표현식을 대체합니다(대괄호 - 안에 있는 내용은 제외). 예를 들어,
$ cat test001.txt | sed -e 's/^\([[:space:]]*\)\(bucket.*endy\)$/\1(\2/'
this
is a
test bucket
bucket line not this one.
(bucket lein endy
(bucket and others endy
and
a ttest
두 개의 하위 표현식이 생성됩니다.
- 선행 공백:
^\([[:space:]]*\)
- "bucket"으로 시작하고 "endy"로 끝나는 문자열(EOL에서):
\(bucket.*endy\)$
\1(\2
그런 다음 공백, 여는 괄호, 마지막으로 bucket..endy 문자열과 일치하는 모든 줄을 바꿉니다 .
답변2
또 다른 접근 방식은 다음과 같습니다.
sed -e '/^[[:space:]]*bucket.*endy$/s/bucket/(bucket/' file.txt
초기 내용은 /pattern/
sed에게 that이 포함된 행에서만 작동하도록 지시 pattern
하고 나머지는 간단한 표준 교체입니다.
답변3
\s
BRE의 일부가 아니며 사용 sed
됩니다. BRE의 \s
텍스트와 동일합니다 s
. 동등합니다. 다음을 시도해 \s
보십시오[[:space:]]
sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt