sed "s/\(.*\)/\t\1/" $filename > $sedTmpFile && mv $sedTmpFile $filename
Я ожидаю, что этот sed сценарий вставит вкладку в шрифт каждой строки в $filename
однако это не. По некоторым причинам это вставляет t вместо этого..Странно..
Не все версии sed
понимают \t
. Вместо этого просто вставьте литеральную табуляцию (нажмите Ctrl-V, затем Tab).
Вам не нужно использовать sed
для выполнения подстановки, когда на самом деле вы просто хотите вставить табуляцию перед строкой. Замена в этом случае - дорогостоящая операция по сравнению с простой распечаткой, особенно когда вы работаете с большими файлами. Его тоже легче читать, так как это не регулярное выражение.
например, используя awk
awk '{print "\t"$0}' $filename > temp && mv temp $filename
Используя Bash, вы можете программно вставить символ TAB следующим образом:
TAB=$'\t'
echo 'line' | sed "s/.*/${TAB}&/g"
echo 'line' | sed 's/.*/'"${TAB}"'&/g' # use of Bash string concatenation
sed
не поддерживает \ t
или другие escape-последовательности, такие как \ n
для этого иметь значение. Единственный способ, который я нашел для этого, - это вставить в сценарий символ табуляции с помощью sed
.
Тем не менее, вы можете рассмотреть возможность использования Perl или Python. Вот небольшой сценарий Python, который я написал, который я использую для всех потоковых регулярных выражений:
#!/usr/bin/env python
import sys
import re
def main(args):
if len(args) < 2:
print >> sys.stderr, 'Usage: <search-pattern> <replace-expr>'
raise SystemExit
p = re.compile(args[0], re.MULTILINE | re.DOTALL)
s = sys.stdin.read()
print p.sub(args[1], s),
if __name__ == '__main__':
main(sys.argv[1:])