Простая sed замена вкладок, загадочно перестав работать

Заглавная роль ни на что не должна влиять; даже DKIM и SPF только проверят часть имени хоста адреса. Может быть некоторое другое продолжение несоответствия заголовка; это помогло бы отправить почту на сервер, который Вы знаете, не отфильтрует его и проверит все заголовки для наблюдения то, что закончилось там. Вы могли бы также попытаться добавить a Sender: root <xxx@xxxx> заголовок, который соответствует отправителю точно. Много спам-фильтров проверят против Sender заголовок, но все еще показывает From заголовок пользователям.

46
14.01.2016, 01:35
9 ответов

Синтаксис \t для символа табуляции в sed не является стандартным. Этот escape является расширением GNU sed. В сети можно найти много примеров, которые используют его, потому что многие люди используют GNU sed (это реализация sed на не встраиваемом Linux). Но OS X sed, как и другие *BSD sed, не поддерживает \t для табуляции и вместо этого рассматривает \t как обратный слеш, за которым следует t.

Существует множество решений, например:

  • использовать буквальный символ табуляции.

    sed -i.bak 's/ / /' file.txt
    
  • Для создания символа табуляции используйте tr или printf.

    sed -i.bak "s/$(printf '\t')/ /" file.txt.
    sed -i.bak "s/$(echo a | tr 'a' '\t')/ /" file.txt
    
  • Используйте синтаксис строк bash's, позволяющий обратный слеш .

    sed -i.bak $'s/\t/ /' file.txt
    
  • Используй Перла, Питона или Руби. Фрагмент Руби, который вы разместили, работает.

68
27.01.2020, 19:34

Я удивлен, что никто не предложил очень простое решение: sed -i.bak -E 's/\\\\\t/ /' file.txt Это должно помочь.

Вам нужно экранировать escape (отсюда 3 \t), чтобы sed понял, что вы пытаетесь использовать символ \t в регулярном выражении, когда все подставляется...

-1
27.01.2020, 19:34
[

] Используйте специфическую для Bash [] цитату [], которая позволяет использовать строки, как в C, чтобы реальный символ табуляции передавался в sed, а не в экранирующую последовательность:[

] [
sed -i.bak -E $'s/\t/  /' file.txt
]
14
27.01.2020, 19:34
[

] Как уже отмечалось, не все реализации []sed[] поддерживают нотацию []\t[] в виде горизонтальной закладки. [

] [

]Вы можете легко осуществить замену с помощью:[

] [
 perl -pi.old -e 's{\t+}{ }g' file.txt
] [

]Это выполняет репликацию in situ, которая сохраняет исходный файл как "*.old". Perl позволяет использовать альтернативные разделители для классических []/[], делая выражение намного более читабельным (т.е. лишённым синдрома "склонения зубочистки").[

] [

]В []+[] сказано, что одно или несколько повторений символа табуляции должны быть заменены. Модификатор []g[] позволяет производить глобальные замены по всему концу каждой строки.[

].
1
27.01.2020, 19:34
[

] Если вам нужен более мощный [] sed[] (поддерживающий [] \t[] и более), чем тот, который установлен на операционной системе X, установите [] GNU sed[].[

].
0
27.01.2020, 19:34
sed -i $'s/\t/  /g' file.txt 

работает для меня на OS X и это та же команда, которую я постоянно использую на linux.

3
27.01.2020, 19:34

Вы также можете использовать echoвнутриsed:

sed -i "s/$(echo '\t')//g"

0
27.01.2020, 19:34

Если можно требовать bashили zshв качестве оболочки, то это самое простое решение, которое я могу придумать:

sed "s/$(echo -n -e "\t")/ /" file.txt

Обратите внимание, однако, что флаги echo(-nи-e)не определены в POSIX, поэтому оболочка, соответствующая POSIX, не требует понимания этих флагов, хотя многие из соображений совместимости требуют этого.

0
27.01.2020, 19:34

Основываясь на приведенных выше ответах, вот простая копия -и -вставляемая версия, которая работает в OS X, и вам не нужно об этом думать.

mysql -h myhost.com -u username -p  -e "select * from users;" -B --raw  | sed $'s/\t/,/g' > filename.csv

$ в команде sed — это волшебство, благодаря которому она работает.

0
14.07.2020, 19:06

Теги

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