Заглавная роль ни на что не должна влиять; даже DKIM и SPF только проверят часть имени хоста адреса. Может быть некоторое другое продолжение несоответствия заголовка; это помогло бы отправить почту на сервер, который Вы знаете, не отфильтрует его и проверит все заголовки для наблюдения то, что закончилось там. Вы могли бы также попытаться добавить a Sender: root <xxx@xxxx>
заголовок, который соответствует отправителю точно. Много спам-фильтров проверят против Sender
заголовок, но все еще показывает From
заголовок пользователям.
Синтаксис \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
Используй Перла, Питона или Руби. Фрагмент Руби, который вы разместили, работает.
Я удивлен, что никто не предложил очень простое решение:
sed -i.bak -E 's/\\\\\t/ /' file.txt
Это должно помочь.
Вам нужно экранировать escape (отсюда 3 \t), чтобы sed понял, что вы пытаетесь использовать символ \t в регулярном выражении, когда все подставляется...
] Используйте специфическую для Bash [] цитату [], которая позволяет использовать строки, как в C, чтобы реальный символ табуляции передавался в sed, а не в экранирующую последовательность:[
] [sed -i.bak -E $'s/\t/ /' file.txt
] ] Как уже отмечалось, не все реализации []sed[
] поддерживают нотацию []\t[
] в виде горизонтальной закладки. [
]Вы можете легко осуществить замену с помощью:[
] [ perl -pi.old -e 's{\t+}{ }g' file.txt
]
[]Это выполняет репликацию in situ, которая сохраняет исходный файл как "*.old". Perl позволяет использовать альтернативные разделители для классических []/[
], делая выражение намного более читабельным (т.е. лишённым синдрома "склонения зубочистки").[
]В []+[
] сказано, что одно или несколько повторений символа табуляции должны быть заменены. Модификатор []g[
] позволяет производить глобальные замены по всему концу каждой строки.[
] Если вам нужен более мощный [] sed[
] (поддерживающий [] \t[
] и более), чем тот, который установлен на операционной системе X, установите [] GNU sed[].[
sed -i $'s/\t/ /g' file.txt
работает для меня на OS X и это та же команда, которую я постоянно использую на linux.
Вы также можете использовать echo
внутриsed
:
sed -i "s/$(echo '\t')//g"
Если можно требовать bash
или zsh
в качестве оболочки, то это самое простое решение, которое я могу придумать:
sed "s/$(echo -n -e "\t")/ /" file.txt
Обратите внимание, однако, что флаги echo
(-n
и-e
)не определены в POSIX, поэтому оболочка, соответствующая POSIX, не требует понимания этих флагов, хотя многие из соображений совместимости требуют этого.
Основываясь на приведенных выше ответах, вот простая копия -и -вставляемая версия, которая работает в OS X, и вам не нужно об этом думать.
mysql -h myhost.com -u username -p -e "select * from users;" -B --raw | sed $'s/\t/,/g' > filename.csv
$ в команде sed — это волшебство, благодаря которому она работает.