문자열의 한쪽 끝에서 문자열의 다른 쪽 끝으로 숫자를 복사하는 방법은 무엇입니까? 예를 들어,
입력 -
Example123:Hello
Exp12:Hey1
Exp:heylo
예상 출력 -
Example123:Hello123
Exp12:Hey112
Exp:heylo
sed 또는 awk를 사용할 의향이 있습니다. 구분 기호를 고려해야 하므로 row1은 숫자가 추출되는 행이고 행 2는 숫자가 배치되는 행입니다.
답변1
:
각 입력 줄이 한 번만 발생한다고 가정하면 다음을 수행할 수 있습니다.
sed 's/\([[:digit:]]*\):.*/&\1/' < input
두 개 이상이 있을 수 있고 :
두 번째 필드가 아닌 줄 끝에 숫자를 추가하려는 경우 다음과 같이 더 복잡해집니다.
sed 's/^\([^:]*[^:[:digit:]]\)\{0,1\}\([[:digit:]]*\):.*/&\2/' < input
답변2
여기에서 awk를 사용할 수 있습니다.
awk -F':' '{ j=$1; gsub(/[^0-9]+/,"",j); print $0 j }'
설명하다
-F':'
: awk에게 콜론을 필드 구분 기호로 사용하도록 지시합니다.
j=$1; gsub(/[^0-9]+/,"",j)
: 첫 번째 열을 임시 변수에 할당 j
하고 숫자가 아닌 모든 항목을 제거합니다.j
print $0 j
j
:마지막으로 원래 문자열을 숫자와 함께 인쇄합니다.
답변3
GNU awk의 기능을 사용하여 match()
일치하는 그룹을 배열에 저장하면 다음을 수행할 수 있습니다.
awk -F: -v OFS=: 'match($1, /([0-9]+)$/ , arr) { $2 = $2 arr[1] } 1' file
POSIX 호환에서는 awk
다음을 수행할 수 있습니다.
awk -F: -v OFS=: 'match($1, /[[:digit:]]+$/) { $2 = $2 substr($0, RSTART, RLENGTH) }; 1' file
바라보다awk를 사용하여 파일을 영구적으로 변경하는 방법은 무엇입니까? ("내부" 편집, "sed -i"와 동일)파일 변경 사항을 지속적으로 유지합니다.
답변4
Bash에서는 최대한 짧게... 제 생각엔...
sed 's/\([0-9]\+:\).*/&\1/' < input
(@Stèphane의 이전 답변의 도움을 받아)