Удалить обратную косую черту из текстового файла

10

у меня есть

Входные данные:

 NISHA =\455  

Вывод:

 NISHA = 455

Я хочу удалить \из вывода. Я пытался использовать команду, sed "s/[\]//g" Pно она не работает, и она отмечает ошибку:

character found after backslash is not meaningful
Yisha
источник
3
У вас, кажется, есть реализация не-POSIX sed(или, возможно, вы запускаете эту команду из оболочки не-POSIX?). Вам не нужно, sedхотя, trдостаточно tr -d '\\' < P.
Стефан Шазелас

Ответы:

20

Вы можете заменить обратную косую черту на пробел, как показано в примере с результатом:

sed 's/\\/ /g'

или вы можете удалить его, как показано в коде:

sed 's/\\//g'

Специальные символы

Возможны проблемы с выходом из обратной косой черты, чтобы отменить его особое значение. Обратная косая черта - это специальный символ, используемый для экранирования как в оболочке, так и в регулярных выражениях.

Команда, которую вы вводите в командной строке оболочки или сценарии, сначала обрабатывается оболочкой, которая интерпретирует особое значение символов и их экранирование. Затем результат передается исполняемой команде (например sed), которая выполняет свою собственную интерпретацию символов. Когда вы создаете команду, ментальная процедура работает противоположным образом: сначала добавьте экранирование для регулярного выражения, а затем добавьте экранирование для оболочки.

  1. В регулярном выражении (ввод в команды, подобные sedи grepт. Д.) Обратная косая черта может быть экранирована обратной косой чертой, например, так: \\вы также можете использовать выражение set, [\]как вы использовали, потому что обратная косая черта теряет свое особое значение.

  2. В оболочке (вроде bash) вы можете избежать обратной косой черты. Так что вместо того, чтобы \писать \\. Заключение строки в двойные кавычки "усложняет поведение обратной косой черты <1>, но двойная обратная косая черта по-прежнему будет вызывать одну обратную косую черту. Заключение строки в одинарные кавычки 'делает буквально каждый символ, кроме '.

Если вы хотите использовать двойные кавычки , вы можете использовать одно из следующих:
sed "s/\\\\//g"- Escape \by \в оболочке и \снова экранируйте каждый в регулярном выражении. На самом деле двойные кавычки не нужны в этом случае, потому что каждый специальный символ правильно экранирован.
sed "s/[\\]//g"- Побег в оболочке с помощью обратной косой черты \и в регулярном выражении использовать набор [ ].
sed "s/[\]//g"- Да, ваш пример должен работать в POSIX-совместимой среде! Между двойными кавычками \представлен сам, если он не предшествует специальному символу в контексте двойных кавычек: $`"\или новой строки. Похоже, что в вашем случае либо оболочка, либо sedне соответствует стандарту POSIX.

С одинарными кавычками вы также можете использовать строку как вы использовали или более короткий путь:
sed 's/[\]//g'
sed 's/\\//g'

pabouk
источник
6

Вы должны избежать обратной косой черты. Попробуй это:

sed 's/\\//g'
jherran
источник
3

Если вы не хотите использовать решения sed, попробуйте выполнить следующие команды:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11
αғsнιη
источник
2

В awk я бы так сделал,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
Авинаш Радж
источник
1
sed 's/\\//'

Поместите \перед, \как вы делаете с большинством специальных символов.

Отображаемое имя
источник
Вы опустили gфлаг по неизвестной причине. Это меняет поведение команды, но такое изменение не было запрошено в вопросе. В противном случае ваш ответ не принесет ничего нового по сравнению с предыдущими ответами.
pabouk