Почему sed не распознает \t как вкладку?

sed "s/\(.*\)/\t\1/" $filename > $sedTmpFile && mv $sedTmpFile $filename

Я ожидаю, что этот sed сценарий вставит вкладку в шрифт каждой строки в $filename однако это не. По некоторым причинам это вставляет t вместо этого..Странно..

93
задан codeforester 20 February 2018 в 20:05
поделиться

4 ответа

Не все версии sed понимают \t. Вместо этого просто вставьте литеральную табуляцию (нажмите Ctrl-V, затем Tab).

115
ответ дан 24 November 2019 в 06:16
поделиться

Вам не нужно использовать sed для выполнения подстановки, когда на самом деле вы просто хотите вставить табуляцию перед строкой. Замена в этом случае - дорогостоящая операция по сравнению с простой распечаткой, особенно когда вы работаете с большими файлами. Его тоже легче читать, так как это не регулярное выражение.

например, используя awk

awk '{print "\t"$0}' $filename > temp && mv temp $filename
3
ответ дан 24 November 2019 в 06:16
поделиться

Используя Bash, вы можете программно вставить символ TAB следующим образом:

TAB=$'\t' 
echo 'line' | sed "s/.*/${TAB}&/g" 
echo 'line' | sed 's/.*/'"${TAB}"'&/g'   # use of Bash string concatenation
40
ответ дан 24 November 2019 в 06:16
поделиться

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:])
0
ответ дан 24 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

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