2017-01-06 3 views
0

Для моей программы python требуется системный вызов со следующей командой.'' в строке в 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/'\'\''  

Как вы можете видеть, последний «» стал \ «\» в строке. Как мне просто «?»?

+5

это просто отображается таким образом (потому что '' используются для отображения строкового литерала), фактическое содержимое строки не изменилось. Сделайте 'print some_string', чтобы увидеть фактическую строку. – Rusty

+1

Вы смотрите на строку 'repr()' строки. Сделайте так, как предложил @Rusty, и вы увидите, что строка в порядке. – jszakmeister

+0

Что сказал Расти. У вашей строки действительно есть два '' 'в конце. BTW, используя 'cat' для подачи файла в' grep', является анти-шаблоном, просто дайте файлу arg 'grep' напрямую. –

ответ

4

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

enter image description here

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

+1

Это прояснилось, спасибо. Человек, которому я люблю stackoverflow! –

0

Попробуйте положить г перед последней строкой, как так:

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

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

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

+0

Было бы здорово, если бы вы объяснили, что такое «сырые» строки. –

1

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

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

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

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

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

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

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

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

Смежные вопросы