Способ удаления новой строки (^ M) только из переменных, а не из файла

Если вы используете драйвер nvidia> = 365.20, попробуйте включить параметр «Force Full Composition Pipeline» в nvidia-settings .

enter image description here

7
27.11.2016, 01:00
4 ответа

^M - это возврат каретки (CR), который может быть указан как \r для tr или внутри $'...'. \n задает перевод строки (LF), который является ^J. В Unix окончанием строки является LF, а в Windows разделителем строк является двухсимвольная последовательность CR-LF, поэтому текстовые файлы Windows, просматриваемые в Unix-системе, такой как Linux или macOS, выглядят так, как будто в конце каждой строки стоит ^M, за исключением последней строки, в которой отсутствует последняя новая строка.

Вы можете удалить возврат каретки из файла с помощью tr с

tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt

или более просто с помощью dos2unix.

Чтобы избежать модификации файлов, вы можете проверять каждую строку при чтении и отделять CR в конце строки. Например, если вы используете read для разбора значений, разделенных табуляцией, то удалите CR в конце последнего поля. Расширение параметра ${VAR%$'\r'} дает значение VAR за вычетом идущего следом CR и дает значение VAR, если оно не заканчивается CR.

while IFS=$'\t' read -r -a line
do
    line[$((${#line[@]}-1))]="${line[$((${#line[@]}-1))]%$'\r'}"
    Type1="${line[0]}"
    Type2="${line[1]}"
done < "$TXTFILE"
9
27.01.2020, 20:14

Используйте (для коротких строк):

${var//$'\015'}

Пример:

$ var=$'This is a test of a CR (\r) character'
$ echo "${var//$'\r'}"
This is a test of a CR () character

Для более длинных строк вам может потребоваться sed или awk.

4
27.01.2020, 20:14

Вот самый простой способ исправить ваш скрипт, просто добавьте «возврат каретки» в качестве внутреннего разделителя полей для команды чтения:

while IFS=$'\t\r' read -r -a line
do
  Type1="${line[0]}"
  Type2="${line[1]}"
done < $TXTFILE
8
27.01.2020, 20:14

Более полезный способ преобразования содержимого файлов "DOS" , у которых нет другого маркера содержимого, кроме окончания строки CR + LF (в отличие от LF только в Linux).

Для Ubuntu, сначала и только один раз, выполните

sudo apt install dos2unix

использование, как указано ниже, здесь с od , используемым для проверки вывода

$ dos2unix < $TXTFILE | od -t x1z -w17 
0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0a  >value1    value2.<
0000021 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0a  >value3    value4.<
0000042 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0a  >value5    value6.<
0000063 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0a  >value7    value8.<
0000104

$ cat $TXTFILE | od -t x1z -w18
0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0d 0a  >value1    value2..<
0000022 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0d 0a  >value3    value4..<
0000044 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0d 0a  >value5    value6..<
0000066 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0d 0a  >value7    value8..<
0000110

Это переведет не только окончания строк, но и другие специальные символов, в зависимости от параметров dos2unix или его аналога unix2dos (который устанавливается одновременно).

0
27.01.2020, 20:14

Теги

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