sed확장 정규식

sed확장 정규식

분명히 나는 ​​거대한 문서에서 모든 단락의 첫 번째 단어를 이탤릭체로 표시하려고 노력하고 있는 것 같습니다. 접두사를 붙이는 것은 비교적 쉽다고 생각하는데, 줄 끝이 아닌 접미사의 첫 단어만 표현하려면 어떻게 해야 할까요? 파일은 공백으로 구분되어야 합니다.

sed -e 's/^/<i>/' file > file.new

다른 구문으로 sed를 두 번 실행해야 합니까, 아니면 하나의 명령을 사용하여 이를 달성할 수 있습니까? 혹시라도 문제가 생길까봐 새 파일로 출력하고 있습니다.

다음은 파일의 몇 가지 예시 라인입니다.

Snapdragon  Plant with a two-lipped flower.

Snap-fastener  = *press-stud.

Snapper  Any of several edible marine fish.

Snappish  1 curt; ill-tempered; sharp. 2 inclined to snap.

나는 그것이 다음과 같이 보이기를 원합니다 :

<i>Snapdragon</i>  Plant with a two-lipped flower.

<i>Snap-fastener</i>  = *press-stud.

<i>Snapper</i>  Any of several edible marine fish.

<i>Snappish</i>  1 curt; ill-tempered; sharp. 2 inclined to snap.

모든 줄이 한 줄인 것은 아니며 일부 용어에는 여러 줄 정의가 있습니다.

답변1

sed를 사용하여,

  • 줄 시작 부분에 문자가 있는 경우
  • 공백이 아닌 문자를 원하는 수만큼 캡처하고
  • 캡처된 문자를 주변 문자로 대체 합니다 <i></i>

이와 같이:

sed '/^[a-zA-Z]/ s!\([^ ]*\)!<i>\1</i>!' < file > file.new

이 예시 입력에서는 다음과 같습니다.

Snapdragon  Plant with a two-lipped flower.

Snap-fastener  = *press-stud.

Snapper  Any of several edible marine fish.

Snappish  1 curt; ill-tempered; sharp. 2 inclined to snap.

출력은 다음과 같습니다

<i>Snapdragon</i>  Plant with a two-lipped flower.

<i>Snap-fastener</i>  = *press-stud.

<i>Snapper</i>  Any of several edible marine fish.

<i>Snappish</i>  1 curt; ill-tempered; sharp. 2 inclined to snap.

sed 명령의 일부를 분석하면 다음과 같습니다.

  • /^[a-zA-Z]/-- 이것은 주소 필터입니다. 즉, 후속 명령은 이 정규식과 일치하는 행에만 적용됩니다. 정규식에서는 a-z줄 시작 부분 뒤에 문자(소문자 또는 대문자)가 있어야 합니다 .A-Z^

  • s!\([^ ]*\)!<i>\1</i>!-- 찾기 및 바꾸기 명령입니다. 검색과 바꾸기 사이에 구분 기호를 사용하는데, 일반적인 구분 기호는 슬래시인데, 대체 텍스트에는 슬래시가 있으므로 구분 기호를 느낌표로 변경했습니다 !. 검색어는 캡처 괄호(이스케이프해야 함)와 [^ ]*"공백을 제외한 모든 항목과 0회 이상 일치"라는 정규 표현식의 두 부분으로 구성됩니다 *. 대체 텍스트는 캡처된 콘텐츠를 다시 참조 \1하고 이를 HTML 태그로 그룹화합니다. 둘러싸여 있습니다.

공백이 아닌 각 줄을 단락 태그로 추가로 감싸려면 또 다른 sed 표현식을 추가하세요.

sed -e '/^[a-zA-Z]/ s!\([^ ]*\)!<i>\1</i>!' -e '/./ { s/^/<p>/; s!$!</p>! }' < file

추가 표현은 다음을 의미합니다.

  • 하나의 문자가 포함된 행과 일치 - 빈 행을 건너뜁니다.
  • {다음 두 명령을 함께 결합
  • 줄의 시작 부분을 검색하여 ^여는 단락 태그로 바꿉니다.
  • $줄 끝을 검색하여 닫는 단락 태그로 바꿉니다.
  • }최종 그룹

답변2

다음과 같은 방법으로 이 작업을 수행할 수 있습니다 sed.

$ sed '/^$/n;s#^\([^ ]*\)#<i>\1</i>#' input.txt
<i>Snapdragon</i>  Plant with a two-lipped flower.

<i>Snap-fastener</i>  = *press-stud.

<i>Snapper</i>  Any of several edible marine fish.

<i>Snappish</i>  1 curt; ill-tempered; sharp. 2 inclined to snap.

설명하다

위 내용에는 sed2개가 포함되어 있습니다. 첫 번째 블록은 빈 줄을 감지 /^$/하고 건너뜁니다 n.

  • 빈 줄을 건너뛰세요/^$/n

두 번째 블록은 모든 어려운 작업을 수행 s#..#..#하고 공백을 포함하지 않는 하위 문자열을 감지합니다 \([^ ]*\). 패턴은 래핑하여 "저장"되므로 \(..\)나중에 를 통해 다시 사용할 수 있습니다 \1.

  • 하위 문자열을 첫 번째 공백과 일치\([^ ]*\)
  • 일치 항목을 저장 \1하고 다음과 같이 래핑합니다.<i>...</i>

답변3

awk를 사용해 볼 수 있습니다.

awk '{$1="<i>$1</i>"; print $0}' file > file.new

답변4

sed확장 정규식

줄 들여쓰기 여부에 관계없이 대체 패턴의 검색어를 나타내기 위해 첫 번째 (공백이 아닌) 문자 하위 문자열 주위에 <i>마커 를 배치 합니다.</i>[^[:space:]]&

-E활성화를 위한 sed확장 정규 표현식 :

sed -E 's/[^[:space:]]+/<i>&<\/i>/' file

구분된 검색 및 대체 용어를 사용하는 경우 other 앞에 /와야 합니다 (여기서는 두 번째 태그와 같습니다). 해당 문자가 용어에 나타나지 않는 한 구분 기호 검색어 및 대체 용어 외부의 문자를 사용하여 이 추가 단계를 피할 수 있습니다 . 예를 들어 다음과 같이 쉼표를 사용합니다./\/

sed -E 's,[^[:space:]]+,<i>&</i>,' file

이것이 가장 짧은 방법입니다.

(하나 이상의 패턴 발생을 나타냄)은 정규 표현식이 아닌 일반 표현식에서는 작동하지 않지만 +(0개 이상의 발생을 나타냄)을 사용하면 조금만 더 입력하면 동일한 작업을 수행할 수 있습니다.-e-E*

sed -e 's,[^[:space:]][^[:space:]]*,<i>&</i>,' file

관련 정보