다음 항목 목록이 있습니다.
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 -> aceg
sed
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