텍스트 파일에서 특정 문자열로 시작하는 각 줄의 모든 문자를 제거하는 방법은 무엇입니까?

텍스트 파일에서 특정 문자열로 시작하는 각 줄의 모든 문자를 제거하는 방법은 무엇입니까?

다음과 같이 각 줄에서 "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éphanelatin-1 또는 latin-0 인코딩 사용은 sedUTF-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대 기업 중 하나입니다.

관련 정보