Как удалить специальный символ «M-BM-» с sed

Для любителей очень шумно, когда использование ЦП составляет 100%. Это не нормально для использования ЦП на уровне 100%.

Вы можете попытаться найти виновника для этого использования ЦП, перейдя в Sytem-> Administration-> System Monitor и щелкнув вкладку «Процессы». Вы можете фильтровать с использованием ЦП, чтобы процессы, использующие большинство CPU, находились наверху:

Если вы сообщите нам этот процесс, мы сможем вам помочь. Если вы можете сделать снимок экрана, как тот, который я взял, и добавить его к вашему вопросу, это было бы полезно.

1
задан 24 July 2015 в 15:22

4 ответа

Символы M-BM- представляют собой ASCII-представление последовательности байтов 0xc2 0xa0, которая является кодировкой UTF8 символа юникода A0 - неразрывным символом пробела. Этот символ может быть вставлен в документы LibreOffice и Microsoft Word, используя последовательность клавиш Ctrl + Shift + SPACE.

Например, если мы создадим новый .odt-документ в LibreOffice и наберите ABC Ctrl + Shift + Shift DEF, затем Save As... Text (игнорируя предупреждение о том, что документ может содержать функции, которые не могут быть сохранены в этом формате), затем просмотрите полученный .txt файл с помощью cat: [ ! d4]

$ cat nbsp.txt 
ABC DEF

, а затем снова с переключателем -v для отображения непечатаемых символов

$ cat -v nbsp.txt 
M-oM-;M-?ABCM-BM- DEF

Обратите внимание, что мы также получаем начальную последовательность M-oM-;M-? или шестнадцатеричную 0xef 0xbb 0xbf, которая является меткой порядка байтов UTF8 (BOM), согласующейся с типом файла, сообщенным командой file, т. е.

$ file nbsp.txt 
nbsp.txt: UTF-8 Unicode (with BOM) text
[!d13 ]

Используя od для печати шестнадцатеричных значений в порядке байтов, мы видим

$ od -tx1 nbsp.txt
0000000 ef bb bf 41 42 43 c2 a0 44 45 46 0a
0000014

. Эти символы можно манипулировать с помощью стандартных инструментов, таких как sed или tr, указав шестнадцатеричные коды как escape-последовательности, например заменить неиспользуемое пространство простым пространством ASCII

$ sed 's/\xc2\xa0/ /g' nbsp.txt
ABC DEF

Повторная проверка с помощью od подтверждает замену обычным пространством ASCII 0x20 (десятичное число 32)

$ sed 's/\xc2\xa0/ /g' nbsp.txt | od -tx1
0000000 ef bb bf 41 42 43 20 44 45 46 0a
0000013

В gnome-терминале (и, возможно, других эмуляторах терминала, поддерживающих UTF8), также можно ввести значение кодовой точки Юникода непосредственно с помощью последовательности клавиш Shift [ ! d6] + Shift + SPACE , за которым следует шестнадцатеричное значение, затем клавиша Enter - последовательность отображается сначала как u ... но затем символ должен составлять, когда вы нажимаете Enter, например, для той же незаменимой замены пространства мы можем сделать

$ sed 's/Ctrl+Shift+ua0

, который отображается как

$ sed 's/̲/̲u̲a̲0̲

, а затем завершается как

$ sed 's/ / /g' nbsp.txt
ABC DEF

Используя cat -v, мы можем подтвердить, что последовательность M-BM- стала обычным пространством

$ sed 's/ / /g' nbsp.txt | cat -v
M-oM-;M-?ABC DEF

Вы можете захотеть посмотрите на более общие кодирующие преобразователи, такие как значение кодовой точки и uconv.

8
ответ дан 24 May 2018 в 16:56
  • 1
    Спустя почти 2 года ваше решение помогло мне избавиться от других надоедливых персонажей, которые нельзя было просто скопировать и вставить, как в моем решении. Так что это, безусловно, более универсальный, особенно когда речь идет о новых линиях. – Rafal 24 July 2015 в 15:21

Вы можете удалить ^ M из файлов непосредственно с помощью команды sed, например :

sed -i'.bak' s/\r//g *.*

Если вы довольны изменениями, удалите файлы .bak:

rm -v *.bak
1
ответ дан 24 May 2018 в 16:56

«cat -v file» покажет непечатаемые символы в файле. Просто перенаправьте вывод на какой-то временный файл и используйте vim для замены символов M-BM - ничего.

% s / M-BM- // g

Самое простое решение. [ ! d2]

0
ответ дан 24 May 2018 в 16:56

маленький скрипт для удаления этого дьявола M-BM-caracter! ;) На всякий случай будет помощь любому человеку.

#!/bin/bash
#############################################################################
# SCRIPT:   M-BM-Remover.sh
# DESCRIPTION:
#           This script will be able to detect hidden caracter "M-BM-",
#               And/Or remove this !
# REVISIONS:
#           2014/06/11  YG
#____________________________________________________________________________
#
# PARAMETERS:
#  > $1  :TARGET,      (e.g. '"*.sh"' )
#  > $2  :ACTION,      (e.g. 'remove' )
#  > $2  :BACKUP,      (e.g. '' )
#
#############################################################################

TARGET=$1
ACTION=$2
BACKUP=$3

if [ "$TARGET" = "" ]
then
    echo 'Need to choose target file'
    echo 'M-BM-Remover [TARGET] [show/remove] [backup]'
    echo 'Example : M-BM-Remover "*.sh" remove backup'
    exit
fi

echo "ACTION = $ACTION";
echo "TARGET = $TARGET";
echo

if [ "$ACTION" = "show" ]
then
    for file in $TARGET
    do
        if [ "$file" != "M-BM-Remover.sh" ]
        then
            echo "Traitement de $file ..."
            cat -v $file | grep M-BM-
            NB=`cat -v $file | grep M-BM- | wc -l`
            echo "Occurence(s) : $NB"
        fi
    done 
fi

if [ "$ACTION" = "remove" ] || [ "$ACTION" = "" ]
then
    for file in $TARGET
    do
        if [ "$file" != "M-BM-Remover.sh" ]
        then
            echo "Traitement de $file ..."
            NB=`cat -v $file | grep M-BM- | wc -l`
            if [ "$BACKUP" = "backup" ]
            then
                cat $file > $file.bak
            fi
            cat -v $file.bak | sed s/M-BM-//g > $file
            echo "Occurence(s) removed : $NB"
        fi
        echo
    done 
fi
0
ответ дан 24 May 2018 в 16:56

Другие вопросы по тегам:

Похожие вопросы: