Подтвердить что ты не робот

Как удалить ведущие и завершающие пробелы?

Я использую awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt для удаления как ведущих, так и завершающих пробелов.

Проблема заключается в том, что выходной файл имеет завершающие пробелы! Все строки имеют одинаковую длину - они правильно дополняются пробелами.

Что мне не хватает?

ОБНОВЛЕНИЕ 1

Проблема, вероятно, связана с тем, что конечные пробелы не являются "нормальными" пространствами, а символами \x20 (DC4).

ОБНОВЛЕНИЕ 2

Я использовал gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,""), и он работал. Две странные вещи:

  • Почему\x20 не рассматривается как управляющий символ?

  • Использование '[[:cntrl:][:space:]\x20 НЕ работает. Почему?

4b9b3361

Ответ 1

Эта команда работает для меня:

$ awk '{$1=$1}1' file.txt

Ответ 2

Ваш код в порядке для меня.
У вас может быть что-то еще, чем space и tabulation...
hexdump -C может помочь вам проверить, что не так:

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt | hexdump -C | less

UPDATE:

OK вы определили DC4 (могут быть некоторые другие управляющие символы...)
Затем вы можете улучшить свою команду:

awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' in.txt > out.txt

См. awk manpage:

[:alnum:] Alphanumeric characters.
[:alpha:] Alphabetic characters.
[:blank:] Space or tab characters.
[:cntrl:] Control characters.
[:digit:] Numeric characters.
[:graph:] Characters that are both printable and visible. (A space is printable, but not visible, while an a is both.)
[:lower:] Lower-case alphabetic characters.
[:print:] Printable characters (characters that are not control characters.)
[:punct:] Punctuation characters (characters that are not letter, digits, control characters, or space characters).
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
[:xdigit:] Characters that are hexadecimal digits.

Удаление/перемещение 0x20

Для меня команда в порядке, я протестировал вот так:

$ echo -e "\x20 \tTEXT\x20 \t" | hexdump -C
00000000  20 20 09 54 45 58 54 20  20 09 0a                 |  .TEXT  ..|
0000000b
$ echo -e "\x20 \tTEXT\x20 \t" | awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' | hexdump -C
00000000  54 45 58 54 0a                                    |TEXT.|
00000005

Однако, если у вас есть 0x20 в середине вашего текста
= > , то он не удаляется.
Но это не ваш вопрос, не так ли?

Ответ 3

Возможно, у ваших файлов есть окончания строк Windows. Это означает, что они заканчиваются на \r\n, поэтому совпадение последовательности вкладок и пробелов в конце строки не будет работать - awk пытается сопоставить все вкладки и пробелы, которые появляются после \r. Попробуйте запустить файл через tr -d "\r" перед отправкой его на awk.

Ответ 4

Можно использовать Perl:

perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt

s/foo/bar/ заменить с помощью регулярных выражений
^ начало строки
\s* ноль или больше пробелов
(.*\S) любые символы, заканчивающиеся на пробелы. Захватите его в $1
\s* ноль или больше пробелов
$ конец строки