나는 이것을 가지고있다:
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