2016-05-17 6 views
0

Ich verwende den Befehl "sed", um eine Zeile in einer Datei zu ersetzen. Es funktioniert gut, wenn die Ersatzzeile ein direkter Text ist, aber sobald ich es ersetze, werden $ variable extra Tabs hinzugefügt.bash: sed fügt bei Verwendung einer Variablen einen Tabulatorraum hinzu

# Find Resource ID 
FIND_ID=$(
    aws iam get-account-authorization-details | grep -m1 saml-provider 
) 
echo ${FIND_ID} 
sleep 3 

# Update file with the new resource ID 
# Use | instead of/or : since the ID contains both symbols 

sed -i '.bak' "7s|.*|$FIND_ID|" test-policy.json 

Test-policy.json:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::xxxxxxxx:saml-provider/????" }, "Action": "sts:AssumeRoleWithSAML", "Condition": { "StringEquals": { "SAML:aud": "signin.aws.amazon.com/saml"; } } } ] } 

Irgendwelche Gedanken?

Vielen Dank.

+0

Test-policy.json: { "Version": "2012.10.17", "Statement": [ { "Effekt": "Zulassen", "Principal": { "Federated": "arn: aws: iam :: xxxxxxxx: saml-provider/????" }, "Aktion": "sts: AssumeRoleWithSAML", "Bedingung": { "StringEquals": { "SAML: Aud": "https://signin.aws.amazon.com/saml" } } } ] } – buldozer

+0

Ich würde vorschlagen, 'echo' '$ {FIND_ID}' "' zu zitieren. So sehen Sie, was genau $ FIND_ID ist. – user3159253

+5

Verwenden Sie 'echo" $ FIND_ID "|, um eine noch klarere Darstellung der Variablen zu erhalten cat -vet - die doppelten Anführungszeichen verhindern, dass es mit Leerzeichen verwechselt wird (z. B. wenn Tabs in Leerzeichen umgewandelt werden) und das "cat -vet" verwandelt nicht druckbare Zeichen (wie Tabulatoren) in explizite Steuerzeichenfolgen (Registerkarte wird in^I konvertiert '). –

Antwort

0

Vielen Dank für Ihre Antworten.

@ user3159253 - zuvor habe ich die Anführungszeichen wie Sie vorgeschlagen verwendet, aber keinen Unterschied mit den Tabs gemacht, also habe ich sie zurück.

@Gordon Davisson - es hat nicht funktioniert wie erwartet, aber es gab mir eine Idee die Registerkarten rechts zu entfernen, wenn ich den Anruf beschreiben tue

@Etan Reisner - haben Sie Ihren Vorschlag nicht versucht, ich bin immer noch lernen Hier

ist die Lösung, die den sed-Befehl mit der Option -en verwendet:

# Find Resource ID, and strip leading spaces and tabs 
FIND_ID=$(
    aws iam get-account-authorization-details | grep -m1 saml-provider | sed -e 's/^[ \t]*//' 
) 
echo ${FIND_ID} 

# Use sed to insert the new line 
sed -i '.bak' '7s|"Federated".*|'"${FIND_ID}"'|g' test-policy.json 

# For testing only to confirm the change 
sed '7q;d' test-policy.json 
Verwandte Themen