기본적으로 다음과 같은 줄이 있습니다.
TEXT1910\text0001 “ My hand is broken , ” said the sailor , “ and smoked the pipe . ”
나는 그들이 다음과 같이 보이기를 원합니다 :
TEXT1910\text0001 <s> “ My hand is broken , ” said the sailor , “ and smoked the pipe . ” </s>
다음 명령을 사용하여 작동시키려고 했습니다.
cat text.ign | sed -e 's/\(.*\) \(.*\)/ <s> \1 <\/s>\2/' | less
그러나 이는 다음을 생성합니다.
<s> TEXT1910\text0001 “ My hand is broken , ” said the sailor , “ and smoked the pipe . ” </s>
답변1
목표를 올바르게 설명했다면 다음을 시도해 보세요.
sed 's| | <s> |; s|$|</s>|'
예를 들어 파일로 시작하면 다음과 같습니다.
$ cat text.ign
TEXT1910\text0001 “ My hand is broken , ” said the sailor , “ and smoked the pipe . ”
그리고 다음 명령을 실행하세요.
$ sed 's| | <s> |; s|$|</s>|' text.ign
TEXT1910\text0001 <s> “ My hand is broken , ” said the sailor , “ and smoked the pipe . ” </s>
작동 방식:
s| | <s> |
첫 번째 공백을 로 바꿉니다<s>
.Sed에서는 대체 명령에서 모든 문자를 구분 기호로 사용할 수 있습니다. 여기서는
|
전통적인/
.s|$|</s>|
</s>
줄 끝에 추가하세요 .구분 기호로 사용하고 있으므로
|
이스케이프에 백슬래시가 필요하지 않습니다</s>
.
원래 명령은 어떻게 되었나요?
우리가 가진 질문에서 :
$ sed -e 's/\(.*\) \(.*\)/ <s> \1 <\/s>\2/' text.ign
<s> TEXT1910\text0001 “ My hand is broken , ” said the sailor , “ and smoked the pipe . ” </s>
여기서 문제는 sed 정규식 일치입니다.왼쪽이 제일 길어요성냥. 이는 첫 번째 항목이 \(.*\)
줄의 시작부터 줄의 마지막 공백까지 모든 것과 일치함을 의미합니다. 다른 하나는 \(.*\)
마지막 공백 이후의 모든 항목과 일치합니다.
예제의 줄은 공백으로 끝나기 때문에 이는 \(.*\)
전체 줄을 일치시키고 \(.*\)
다른 줄에서는 아무것도 일치하지 않음을 의미합니다. 따라서 전체 줄 <s>
앞과 뒤에 배치됩니다 .</s>
답변2
간단합니다. 다음을 사용하세요.
sed -Ee 's/(.*[0-9])(.*)/\1 <s>\2 <\/s>/'
귀하의 경우:
cat file | sed -Ee 's/(.*[0-9])(.*)/\1 <s>\2 <\/s>/' | less
그러나 sed 명령 다음에 파일 이름을 사용하고 파이프 사용을 피하는 것이 좋습니다. 즉:
sed -Ee 's/(.*[0-9])(.*)/\1 <s> \2 <\/s>/' file
옵션을 사용하여 파일을 직접 편집하세요 i
.
답변3
$ awk '{ $1 = $1 " <s>"; $(NF+1) = "</s>"; print }' file
TEXT1910\text0001 <s> “ My hand is broken , ” said the sailor , “ and smoked the pipe . ” </s>
<s>
이는 공백으로 구분된 첫 번째 필드 뒤에 공백과 여는 태그를 추가한 다음 </s>
끝에 닫는 태그를 새 필드로 추가합니다. 그런 다음 수정된 행을 인쇄합니다.
이렇게 하면 데이터의 여러 공간이 단일 공간으로 축소됩니다.
답변4
필요한 것은 다음과 같이 작동하는 html과 같은 구문으로 묶인 마지막 큰따옴표에 대한 첫 번째 큰따옴표입니다.
sed -e 's|".*"|<s> & </s>|' inputfile