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

あなたがやりたいことは次のとおりです。

grep -v '"22B333C5-6D7A-4A76-81F2-12A045DAE44C"' file

ファイル内の正規表現に一致するものを検索する代わりに、ファイル内の文字列を検索したい場合は、次のようにします。

$ 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 に答える
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 に答える