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

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

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

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

관련 정보