저는 화학 공식은 물론 숫자 값을 포함한 설명이 포함된 수백 개의 텍스트 파일을 가지고 있습니다. 수식 앞에는 항상 공백이 있지만 뒤에는 공백, 쉼표, 마침표 등이 올 수 있습니다.
문제는 숫자를 아래 첨자로 표시하도록 수식 형식이 지정되지 않았다는 것입니다. 예를 들면 다음과 같습니다.
H2SO4, C5H11OH.
아래 첨자를 HTML 태그로 형식화하고 싶습니다. 예를 들면 다음과 같습니다.
H<sub>2</sub>SO<sub>4</sub>, C<sub>5</sub>H<sub>11</sub>OH
이러한 방식으로 아래 첨자는 HTML 형식으로 렌더링됩니다. 예를 들면 다음과 같습니다.
H2SO4 , C5H11OH
Java, PHP 등을 사용하여 이를 달성하려고 시도했지만 구현이 필연적으로 지저분하고 어색합니다. 나는 우아한 sed/awk 방법이 있다고 생각합니다.
분명히 해결책의 일부는 수식 감지 메커니즘으로 문자 뒤에 하나 이상의 숫자가 오는 정규식을 만드는 것입니다(오류가 있을 수 있으며 나중에 수동으로 수정하겠습니다). 그런 다음 이렇게 결정된 공식이 주어지면 sed 대체를 위해서는 각 숫자 또는 숫자 시퀀스 앞에 레이블을 추가 sub
하고 그 뒤에 하위 레이블 클로저를 추가해야 합니다.
이 작업을 수행하는 줄이 있어야 하는데 알아낼 수 없습니다.
어떤 아이디어가 있나요?
답변1
예를 들어:
sed -r 's:([A-Za-z])([0-9]+):\1<sub>\2</sub>:g'
일을 해야 합니다.
(문자와 숫자 그룹을 일치시키고 이를 \1과 \2로 기억하십시오. 이 모든 것을 동일한 문자(\1)와 토큰에 포함된 숫자 그룹(\2)으로 바꾸십시오 sub
.)
답변2
나중에 수동으로 수정해야 하는 오탐지가 있을 수 있다고 언급했으므로 다음 제한 사항을 통합하는 좀 더 강력한 형식을 고려해 보는 것이 좋습니다.
- 모든 화학 기호시작대문자로.
- 모든 화학 기호는 대문자 또는 대문자 다음에 소문자로 구성됩니다.임시 표시기나는 이것을 무시할 것이다.
다음과 같이 시도해 볼 수 있습니다.
sed 's|\([[:upper:]][[:lower:]]\{0,1\}\)\([0-9]\{1,\}\)|\1<sub>\2</sub>|g'
POSIX가 아닌 -r
옵션을 사용하는 것은 약간 더 읽기 쉽지만 이식성이 떨어집니다.
sed -r 's|([[:upper:]][[:lower:]]?)([0-9]+)|\1<sub>\2</sub>|g'
보장함으로써모두처리되는 "단어"에는 연속된 소문자가 포함되어 있지 않습니다. 물론 가능한 모든 화학 기호를 구체적으로 확인하여 더욱 개선할 수 있지만 보상이 점점 줄어들면서 점점 더 화려해질 것입니다. 위의 내용은 오탐지를 크게 줄여야 합니다.
답변3
그룹화 및 역참조가 비결입니다. 올바른 방향으로 추진해 주셔서 감사합니다. 결국 다음을 사용했습니다.
sed 's/\([A-Z][a-z]*\)\([0-9][0-9]*\)/\1<sub>\2<\/sub>/g' file
이는 문서에 제목(예: h2)이 있는 것을 허용합니다.