각 줄의 끝에 패턴을 검색하고 바꾸고 추가하는 방법

각 줄의 끝에 패턴을 검색하고 바꾸고 추가하는 방법

다음 항목 목록이 있습니다.

bigBone
fishMarket
dogCollar
...

다음과 같이 두 문자 매핑을 생성해야 합니다.

bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...

을 사용하여 위 매핑을 어떻게 만들 수 있습니까 sed?

나는 다음과 같은 것을 시도했습니다.

sed -i -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/' file

나는 보았다이 질문, 그러나 여기에 개념을 통합하는 방법을 잘 모르겠습니다. 감사해요.

답변1

내가 당신을 올바르게 이해했다면 전체 줄을 유지하고 뭔가를 추가하기를 원할 것입니다.

sed -r 's/^([a-z]{1})([a-z]+)([A-Z]{1})([a-zA-Z]+)$/\1\2\3\4 -> \1\L\3/' file

편집하다:

devnull은 이에 대한 쉬운 해결책이 있다는 것을 나에게 상기시켜 주었습니다.

sed -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/& -> \1\L\2/' file

또는 조금 더 우아합니다(첫 번째 시도보다).

sed -r '
h
s/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/
t append
b
: append
H
g
s/\n//' file

답변2

GNU sed 사용:

sed -r 's/(.)[^[:upper:]]*(.).*/& -> \1\L\2/' inputfile

귀하의 입력에 대해 다음이 생성됩니다.

bigBone -> bb
fishMarket -> fm
dogCollar -> dc

답변3

GNU를 사용하여 일반화하려면 다음을 수행 fooBarBaz -> fbb하십시오 .abCdEfGh -> acegsed

sed -r 's/(.)(.*)/\1\n\2 -> \L\1/;:1
        s/\n([^[:upper:]]*([[:upper:]]))(.*)/\1\n\3\L\2/;t1;s/\n//'

POSIX sed에는 \L. 따라서 이식성이 있으면 y소문자로 변환하려는 모든 문자를 사용하고 수동으로 입력해야 합니다 . 다음과 같은 것 :

LC_ALL=C sed '/^\([[:alpha:]]\).*/{
h;s//\1/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/\(.\).\(.\)\(.*\)/\2\
\3 -> \1/;:1
/.*\n[^A-Z]*\([A-Z]\).*/{h;s//\1/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/^\(.\)\n\(.*\)\n\([^A-Z]*[A-Z]\)\(.*\)/\2\3\
\4\1/;t1
}
s/\n//;}'

답변4

이 답변은 @devnull의 답변과 유사합니다.

$ sed 's/\(.\).*\([A-Z]\).*/& -> \1\L\2/g' file
bigBone -> bb
fishMarket -> fm
dogCollar -> dc

관련 정보