Моя программа на Python требует системного вызова с помощью следующей команды.

"cat "+transDir+transFile+" | grep \""+fileName+" \" | cut -d\" \" -f2- | sed \"s/ (/=/g\" | cut -d\"=\" -f1 | sed \"s/) /=/g\" | cut -d\"=\" -f2- | sed \"s/''" 

Строка оказывается что-то вроде этого

#look at the last two characters, ie. ''
'cat ../results/allTrans.txt | grep "Sentence_L3_1 " | cut -d" " -f2- | sed "s/ (/=/g" | cut -d"=" -f1 | sed "s/) /=/g" | cut -d"=" -f2- | sed "s/'\'\''    

Как вы можете видеть, последний '' стал \ '\' в строке. Как я могу получить только ''?

0
Anand PA 6 Янв 2017 в 14:29

4 ответа

Лучший ответ

На простом английском языке: строковые литералы могут быть заключены в одинарные кавычки (') или двойные кавычки ("). Они также могут быть заключены в соответствующие группы из трех одинарных или двойных кавычек (обычно они называются строками с тройными кавычками). Символ обратной косой черты () используется для экранирования символов, которые в противном случае имеют особое значение, таких как символ новой строки, сам обратный слэш или символ кавычки.

enter image description here

\' используется для экранирования ' в случае, если он перепутан с 'this is your command' строкой питона, содержащей одинарные кавычки. Просто игнорируй это.

4
宏杰李 6 Янв 2017 в 11:48

Попробуйте поместить r перед последней строкой, вот так:

г "\" | cut -d \ "\" -f2- | sed \ "s / (/ = / g \" | cut -d \ "= \" -f1 | sed \ "s /) / = / g \" | cut -d \ "= \" -f2- | sed \ "s / ''"

Или, если это не сработает, вы можете попробовать с тройными кавычками:

"" "\" | cut -d \ "\" -f2- | sed \ "s / (/ = / g \" | cut -d \ "= \" -f1 | sed \ "s /) / = / g \" | cut -d \ "= \" -f2- | sed \ "s / ''" ""

0
Holloway 6 Янв 2017 в 11:40

Нотация String Literal (которая обычно является входом для некоторой программы для связи с внешним миром) является не самой String (что на самом деле является в памяти) это то, что вам действительно нужно понять, чтобы не запутаться.

'\n'   = New Line   = Binary(12)
'\\'   = \          = Binary(92)
'\''   = '          = Binary(44)
'\x80' = <Depends*> = Binary(128) 

Левая часть - это то, что вам нужно дать как ввод в Python, чтобы понять это. Правая сторона - это то, что на самом деле находится в памяти.

Это необходимо по той причине, что некоторые символы (называемые управляющими символами ), например Line Feed, не могут быть введены напрямую с помощью клавиатуры и часто имеют различное значение для хост-приложения, поэтому большинство языков определяют способ принять эти символы, используя \ в качестве префикса, а затем некоторый суффикс, который обычно легко запомнить. Сам \ должен быть указан как \\.

И если вы начали свой строковый литерал с ', который имеет особое значение, вам нужно задать его как \', чтобы не путать с окончанием нотации строкового литерала.

* Это зависит от кодировки.

1
Nishant 6 Янв 2017 в 12:08

Попробуй это:

print 'cat ../results/allTrans.txt | grep "Sentence_L3_1 " | cut -d" " -f2- | sed "s/ (/=/g" | cut -d"=" -f1 | sed "s/) /=/g" | cut -d"=" -f2- | sed "s/''\'\''
1
Ranjana Ghimire 6 Янв 2017 в 11:40