한 줄에서 텍스트 일부를 찾아 같은 줄의 다른 부분에 추가

한 줄에서 텍스트 일부를 찾아 같은 줄의 다른 부분에 추가

나는 이것을 가지고있다:

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-3) 파일의 끝까지 모든 것을 가져온 \1\2\3\/\2다음 출력을 변환하여 가져옵니다. 원본 텍스트(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

위 명령은 모든 입력 라인에서 교체를 수행합니다. string 으로 시작하는 줄로만 제한하려면 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

관련 정보