sed - 특정 단어로 시작하고 다른 단어로 끝나는 줄을 변경하시겠습니까?

sed - 특정 단어로 시작하고 다른 단어로 끝나는 줄을 변경하시겠습니까?

예를 들어, 다음과 같습니다.

$ 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

두 개의 하위 표현식이 생성됩니다.

  1. 선행 공백:^\([[:space:]]*\)
  2. "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

\sBRE의 일부가 아니며 사용 sed됩니다. BRE의 \s텍스트와 동일합니다 s. 동등합니다. 다음을 시도해 \s보십시오[[:space:]]

sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt

관련 정보