Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何使用bash查找文本字符串,如-->&引用;配置配置文件[sdk=iphoneos*]“<--这个字符串有许多特殊字符_Xcode_Linux_Bash_Shell_Sed - Fatal编程技术网

Xcode 如何使用bash查找文本字符串,如-->&引用;配置配置文件[sdk=iphoneos*]“<--这个字符串有许多特殊字符

Xcode 如何使用bash查找文本字符串,如-->&引用;配置配置文件[sdk=iphoneos*]“<--这个字符串有许多特殊字符,xcode,linux,bash,shell,sed,Xcode,Linux,Bash,Shell,Sed,正如标题所说,我想在文本中找到一个字符串,但字符串是特殊的。 文本可能是这样的: { PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "22B333C5-6D7A-4A76-81F2-12A045DAE44C"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; } (此外,如果您是ios开发人员,您可能知道文本示例来自XXX.xcodeproj/project.pbxproj) 我

正如标题所说,我想在文本中找到一个字符串,但字符串是特殊的。 文本可能是这样的:

{
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "22B333C5-6D7A-4A76-81F2-12A045DAE44C";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = 2;
}
(此外,如果您是ios开发人员,您可能知道文本示例来自XXX.xcodeproj/project.pbxproj)

我需要查找并删除这行文本:

"PROVISIONING_PROFILE[sdk=iphoneos*]" = "22B333C5-6D7A-4A76-81F2-12A045DAE44C";
在这一行中,它有引号(“),有方括号([]),有星(*),还有空格()。当我尝试使用下面的代码查找这一行时:

provisionStr="22B333C5-6D7A-4A76-81F2-12A045DAE44C"
fileDir=project.pbxproj

totalLineStr=`grep $provisionStr  $fileDir`
sed -i "" "s@$provisionStr@@" $fileDir

此bash代码不起作用。请帮帮我,我刚刚开始学习使用bash。

sed-replacement-with-white:

s(用于替换)/string\u to\u match/new\u string\u或\u empty\u to\u remove/g(用于全局/所有文档)

sed的/\“PROVISIONING\u PROFILE\[sdk=iphoneos\*\]”等于“22b33c5-6D7A-4A76-81F2-12A045DAE44C\”;/g'


使用
\

对双引号、星号和方括号进行转义听起来您只需要:

grep -v '"22B333C5-6D7A-4A76-81F2-12A045DAE44C"' file
如果您确实希望在文件中搜索字符串,而不是在文件中搜索与RE匹配的字符串,那么您只需执行以下操作,例如:

$ awk -v str='"PROVISIONING_PROFILE[sdk=iphoneos*]"' 'index($0,str)' file
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "22B333C5-6D7A-4A76-81F2-12A045DAE44C";

$ awk -v str='"PROVISIONING_PROFILE[sdk=iphoneos*]"' '!index($0,str)' file
{
PREBINDING = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = 2;
}

不要尝试转义所有RE元字符,然后再进行重新比较,因为这毫无意义。如果要查找RE,请进行重新比较,但如果要查找字符串,请进行字符串比较,就这么简单。

您不应该在sed命令中使用
$totalinestr
。此外,您的命令将替换完整的如果你想完全删除这行,你可以简单地做:
sed-i'/22b33c5-6D7A-4A76-81F2-12A045DAE44C/d'$fileDir
非常感谢,它现在可以成功运行了。但是我也想知道,为什么我不能在sed命令中使用$totalinestr?你能告诉我吗?那是因为你有很多sed元字符模式中的字符-
“[]*
。您必须转义模式中的所有字符。这些“特殊字符”是元字符。如果您曾经希望搜索可以包含它们的字符串,但不希望它们被视为重元字符,请不要尝试转义它们,因为这很容易出错,也很笨拙,只需使用一个进行字符串比较的工具,而不是重比较,例如
awk'索引(in,str)“
因为字符串比较是您真正想要的,而不是重新比较。如果我不知道这行是什么,该怎么办?我只知道22B333C5-6D7A-4A76-81F2-12A045DAE44C,我想删除它所属的所有行。
sed'/pattern to match/d'/infle
就像Vivek建议的那样,或者不客气。我刚刚更新了我的答案,说明了如何在文件中搜索字符串,而不是搜索re。