sed에 일치하는 문자열 추가

sed에 일치하는 문자열 추가

다음 입력으로 시작하세요.

$ cat file1
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

첫 번째 숫자 세트를 괄호 안에 넣을 수 있습니다.

$ sed -En 's/[0-9]*:/(&)/ p'
Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

그러나 줄 앞에 &(일치하는 문자열)를 추가하려고 하면 아무것도 얻지 못합니다.

$ sed -En 's/[0-9]*:/(&)/ ; s/^/(&)/ p' infile
()Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
()Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

어떻게 해야 하나요?

답변1

&명령의 대체 부분은 s정규식 일치에 대한 자리 표시자입니다.같은 s명령 으로.

두 번째 대체는 이며 s/^/(&)/, 이는 모든 줄의 시작 부분에 있는 빈 문자열과 일치하므로 ()각 줄의 시작 부분에 리터럴 문자열이 삽입됩니다. 대괄호는 &빈 문자열로 대체되므로 비어 있습니다 .

숫자의 첫 번째 하위 문자열(후행 숫자 포함)을 일치시키려면 이를 대괄호 안에 넣고 대괄호 안의 숫자를 줄의 시작 부분에 추가한 다음 명령이 한 번에 수정되도록 :해야 합니다. s:

$ sed 's/\(.*Device \)\([0-9]*:\)/(\2)\1(\2)/' file
(001:)Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
(001:)Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

여기서는 두 캡처 그룹 모두에서 장치 번호 앞의 부분과 번호 및 콜론을 일치시키고 수집합니다. 그런 다음 대체 텍스트의 첫 번째 그룹 앞에 두 번째 그룹(괄호 안)을 추가할 수 있습니다.

줄의 시작 부분을 일치시켰습니다. .*Device왜냐하면 그냥 사용하면 .*앞의 숫자도 소모 :하고 두 번째 세트에는 콜론만 포함되기 때문입니다.

또는 두 가지 대체를 사용합니다. 첫 번째는 숫자와 콜론을 괄호 안에 넣고 두 번째는 괄호와 일치하여 줄 앞에 추가합니다.

$ sed -e 's/[0-9]*:/(&)/' -e 's/\(.*\)\((.*)\)/\2\1\2/' file
(001:)Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
(001:)Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub

간단히 말해서, s명령은 정규식과 일치하는 문자열 부분만 수정할 수 있으며 &자리 표시자는 정규식과 일치하는 현재 명령의 텍스트로 대체됩니다 s. 본문 중간에 복사 및 수정이 필요한 경우그리고이를 줄의 시작 부분으로 이동한 다음 문자열의 모든 부분을 일치시켜 캡처 그룹으로 캡처해야 합니다.

관련 정보