1

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

{
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。

4

2 回答 2

1

sed 什么都没有的替代品:

s(for substitute)/string_to_match/new_string_or_empty_to_remove/g(for global/all document)

sed 's/\"PROVISIONING_PROFILE\[sdk=iphoneos\*\]" = \"22B333C5-6D7A-4A76-81F2-12A045DAE44C\";//g'

使用转义双引号、星号和方括号\

于 2012-12-08T07:08:09.777 回答
1

听起来你想做的就是:

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 比较,因为这没有任何意义。如果要查找 RE,则进行 RE 比较,但如果要查找字符串,请进行字符串比较,就这么简单。

于 2012-12-08T08:17:02.323 回答