한 줄에서 텍스트 부분을 찾은 다음 같은 줄의 다른 부분에 추가하세요.

한 줄에서 텍스트 부분을 찾은 다음 같은 줄의 다른 부분에 추가하세요.

나는 이것을 가지고있다:

Issue #12345: some more text here https://some.domain/some/path

12345 비트(동적이므로 정규식을 통해 수행해야 함)를 찾은 다음 동일한 줄 끝에 추가하고 싶습니다. 다음과 같습니다:

Issue #12345: some more text here https://some.domain/some/path/12345

sed/awk를 사용하여 어떻게 이를 달성할 수 있나요?

추신: 주위를 둘러봤지만 비슷한 질문은 이것뿐이었습니다.문자열의 일부를 동일한 문자열의 다른 부분으로 교체...하지만 정규식 비트가 누락되었습니다.

답변1

입력이 test.txt 파일에 있다고 가정하면 다음 명령이 작동합니다.

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

파일에서 직접 읽지 않는 경우,

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

산출:

Issue #12345: some more text here https://some.domain/some/path/12345

명령의 기능은 다음과 같습니다.

^(.*)파일의 시작 부분에서 시작하여 다음 일치 항목이 ([[:digit:]]{5})다음 5자리와 일치할 때까지 모든 항목을 가져옵니다 (.*)$. 파일이 끝날 때까지 모든 항목을 가져옵니다. \1\2\3\/\2일치하는 각 그룹에는 번호가 지정됩니다(이 경우 1-3). 출력 형식을 지정하여 원본 텍스트를 얻습니다. (1-3과 일치), '/' 그리고 두 번째 일치.

나중에 참고할 수 있도록 문제를 더 구체적으로 설명할 수 있으면 이상적입니다. 예를 들어, 한 줄의 처음 5자리 숫자를 찾고 이 숫자(앞에 슬래시 포함)를 줄 끝에 추가하고 입력의 모든 줄에 대해 이 작업을 수행한다고 가정해 보겠습니다. 나는 이것이 당신이 의미하는 바라고 생각했습니다. 그렇지 않은 경우 질문을 보다 구체적으로 업데이트할 수 있습니다.

이전 질문을 인용하는 대신 자신이 시도한 몇 가지 시도를 나열할 수도 있습니다. 또한 귀하가 하려는 작업에 대해 더 잘 이해할 수 있도록 도와줍니다.

답변2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

또는 패턴의 확장 정규식을 처리 sed해야 하는 경우-E

sed -E 's,([[:digit:]]+).*,&/\1,' file

대체 sed표현식은 해당 줄에서 첫 번째 양의 정수(숫자 문자열)를 찾아서 캡처합니다. 또한 해당 지점부터 줄 끝까지 나머지 줄과도 일치합니다. 표현식의 대체 부분은 줄의 일치된 비트를 일치된 모든 항목( &)과 슬래시 및 캡처된 숫자 문자열로 대체합니다.

대체 부분에 슬래시가 포함되어 있으므로 표현식에서 구분 기호로 쉼표를 사용하고 있지만 다음과 같이 명령을 작성할 수도 있습니다.

sed -E 's/([[:digit:]]+).*/&\/\1/' file

위의 명령은 모든 입력 줄에서 대체를 수행합니다. 문자열로만 시작하는 행으로 제한하려면 다음을 Issue #사용하십시오.

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

답변3

저는 아래 방법으로 했습니다

명령

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

산출

Issue #12345: some more text here https://some.domain/some/path/12345

관련 정보