다음과 같은 줄이 있습니다
// Testing this
sed 명령을 사용하여 각 줄의 //를 /*(중간에 있는 문장 또는 단어)*/로 바꾸려고 합니다.
그래서 다음과 같아야합니다
/* Testing this */
첫 번째 부분은 부르기 쉽습니다.
sed 's#//#/*#'
그러나 두 번째 부분에서는 이 솔루션을 시도했습니다.
이 기능을 사용하려고 하면 -e
"종료되지 않은 명령" 오류가 발생했습니다. 그런 다음 세미콜론을 사용하여 하나로 만들려고 시도했습니다.
's#//#/*#;#//#s#/$#*/#'
//
그러나 그것이 하는 일은 첫 번째 부분( a 로 대체 /*
)만 수행되고 두 번째 부분( a 를 */
같은 줄 끝에 배치)이 아닌 것처럼 보입니다 .
내가 뭘 잘못했나요? 어떤 조언이라도 대단히 감사하겠습니다.
답변1
어때요?
$ cat testfile
// Testing this
foobar
$ sed 'sx//\(.*\)x/*\1 */x' testfile
/* Testing this */
foobar
$
sx//
: 다음을 포함하는 행 검색//
\(.*\)x
: 줄의 나머지 부분을 캡처 그룹 1에 넣습니다./*\1 */x
: 줄의 나머지 부분을/*
(주석 시작, C 스타일)로 바꾸고 캡처 그룹 1의 내용( 으로 참조됨\1
), 그 다음*/
(주석 끝, C 스타일)으로 바꿉니다.
답변2
또 다른 접근 방식: 주석과 정확히 일치하는 조건으로 검색 및 바꾸기를 수행합니다.
sed '\!//! {s!!/*!; s!$! */!}' file
내용은 다음과 같습니다.
- 라인에 패턴이 포함되어
//
있으면- 일치하는 텍스트를 다음으로 바꾸십시오.
/*
- 그런 다음 줄 끝의 빈 문자열을 다음으로 바꿉니다.
*/
- 일치하는 텍스트를 다음으로 바꾸십시오.