![텍스트 파일에서 특정 문자열로 시작하는 각 줄의 모든 문자를 제거하는 방법은 무엇입니까?](https://linux55.com/image/15653/%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EA%B0%81%20%EC%A4%84%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같이 각 줄에서 "of"로 시작하는 모든 문자를 제거해야 합니다.
Acer_BB1_Locus_1_Transcript_2of285068_Confidence_0.000_Length_1696
Acer_BB1_Locus_1_Transcript_2
답변1
입력이 사용자 로케일의 유효한 텍스트라고 가정하면 다음을 수행할 수 있습니다.
sed 's/of.*//' < input
대체 of
및 임의 개수 *
의 ( )수치( ) 뒤에 빈 문자열이 옵니다 .
(따라서 대부분의 구현에서 로케일의 유효한 문자를 구성하지 않는 첫 번째 바이트에서 중지됨).sed
입력한 인코딩이 사용자의 로케일과 일치하는지 보장할 수 없고 o
일부 문자의 인코딩이 끝나는 문자 인코딩(예: BIG5², BIG5-HKSCS, GBK, GB18030) 중 하나가 아닌 경우 o
다음을 수행할 수 있습니다.
LC_ALL=C sed 's/of.*//' < input
텍스트가 아니거나 로케일 및 GNU 구현과 다른 문자 맵을 사용하여 인코딩된 입력 문제의 예 sed
:
$ locale charmap
UTF-8
$ printf 'Point of St\351phane\n' | sed 's/of.*//'
Point �phane
$ printf 'Point of St\351phane\n' | LC_ALL=C sed 's/of.*//'
Point
( 여기서 Stéphane
latin-1 또는 latin-0 인코딩 사용은 sed
UTF-8 문자 맵이 있는 로케일에서 실행하여 처리됩니다. 여기서 0xe9(0351)만으로는 유효한 문자의 일부를 형성할 수 없습니다.)
BIG5-HKSCS와 같은 문자 인코딩 문제의 예는 다음과 같습니다.
$ echo trèfle of concern | iconv -t BIG5-HKSCS | LC_ALL=C sed 's/of.*//'
tr�
$ echo trèfle of convern | iconv -t BIG5-HKSCS | LC_ALL=zh_HK.big5hkscs sed 's/of.*//' | iconv -f BIG5-HKSCS
trèfle
U+00E8 è
문자는 0x88 0x6f로 인코딩되므로 0x6f도 인코딩입니다 o
. sed
이러한 문자를 올바르게 디코딩하려면 이 문자 맵을 사용하는 로캘에서 실행 해야 합니다 .
일부 sed
구현은 입력을 디코딩할 수 없다는 오류로 인해 실패할 수도 있습니다.
² 귀하가 언급한 Acer는 이 문자 세트를 발명한 5대 기업 중 하나입니다.