2012-12-10 7 views
0

Je veux supprimer le 1er caractère sur le fichier lorsque grep de la chaîne. Mais il faut que la ligne change pour être sur la même position avant la modification.Grep chaîne et supprimer le 1er caractère

fichier Exemple:

#%PAM-1.0 
auth   sufficient  pam_rootok.so 
# Uncomment the following line to implicitly trust users in the "wheel" group. 
#auth   sufficient  pam_wheel.so trust use_uid 
auth   include   system-auth 
account   sufficient  pam_succeed_if.so uid = 0 use_uid quiet 

Voir attendu après le montage:

#%PAM-1.0 
auth   sufficient  pam_rootok.so 
# Uncomment the following line to implicitly trust users in the "wheel" group. 
auth   sufficient  pam_wheel.so trust use_uid 
auth   include   system-auth 
account   sufficient  pam_succeed_if.so uid = 0 use_uid quiet 

Dans ce cas, le 4ème rang juste besoin de supprimer « # », mais je veux faire que lorsque la recherche de la chaîne "suffisante pam_wheel.so confiance use_uid" pas quand pointe la ligne exacte que je veux éditer.

Répondre

4

C'est un travail pour sed:

$ sed -r 's/^#(.*sufficient\s+pam_wheel\.so trust use_uid.*)/\1/' file 
#%PAM-1.0 
auth   sufficient  pam_rootok.so 
# Uncomment the following line to implicitly trust users in the "wheel" group. 
auth   sufficient  pam_wheel.so trust use_uid 
auth   include   system-auth 
account   sufficient  pam_succeed_if.so uid = 0 use_uid quiet 

Regexplanation:

s/       # Substitute 
^#       # A line starting with a # 
(       # Start capture group 
.*       # Followed by anything 
sufficient     # Followed by the word sufficient 
\s+       # Followed by whitespace 
pam_wheel\.so trust use_uid # Followed by the literal string (escaped .) 
.*       # Followed by anything 
)        # Stop capture group 
/       # Replace with 
\1       # The first capture group 

donc efficacement nous lignes correspondant en commençant par # contenant la chaîne sufficient\s+pam_wheel.so trust use_uid et enlever les #

Notes: le drapeau -r est pour regexp étendu, il pourrait être -E pour votre version de sed alors vérifiez le man.

Si vous souhaitez enregistrer les modifications à l'file utiliser l'option -i:

$ sed -ri 's/^#(.*sufficient\s+pam_wheel\.so trust use_uid.*)/\1/' file 

Si la Aligement colonne est importante puis capturer jusqu'à sufficient et après si vous obtenez 2 groupes de capture et le remplacer par \1 \2.

$ sed -r 's/^#(.*)(sufficient\s+pam_wheel\.so trust use_uid.*)/\1 \2/' file 
#%PAM-1.0 
auth   sufficient  pam_rootok.so 
# Uncomment the following line to implicitly trust users in the "wheel" group. 
auth   sufficient  pam_wheel.so trust use_uid 
auth   include   system-auth 
account   sufficient  pam_succeed_if.so uid = 0 use_uid quiet 

Edit:

Remplacer la chaîne AllowUsers support admin avec #AllowUsers support admin:

$ sed -r 's/^(AllowUsers support admin.*)/#\1/' file 
#AllowUsers support admin 

$ sed -r 's/^(DeniedUsers root.*)/#\1/' file 
#DeniedUsers root 
+1

grand exemple grâce @sudo_O –

+0

Un autre cas si je fichier avec: 'AllowUsers soutenir admin' Comment faire ce fichier être: '#AllowUsers soutenir admin' ' DeniedUsers root' –

+0

fait DeniedUsers est sur enraciner une nouvelle ligne et peut-être est bon de remplacer toute la ligne w Qui contiennent AllowUsers –

0

En utilisant awk vous pouvez faire:

awk -F '#' '{ if ($0 ~ /^#.*sufficient +pam_wheel.so trust use_uid/) {$1=""; print;} else print}' infile 

OU (s'il ne peut y avoir qu'un seul # au début):

awk -F '#' '{ if ($0 ~ /^#.*sufficient +pam_wheel.so trust use_uid/) print $2; else print}' infile 
+0

Citer 'mais je veux faire cela lors de la recherche sur la chaîne" suffisante pam_wheel.so confiance use_uid "pas quand pointez la ligne exacte que je veux éditer' –

+0

@sudo_O: Merci de pointer cela même si cela peut encore être fait dans un simple commande awk. SVP vérifiez la réponse éditée maintenant. – anubhava

+0

Mieux, mais vous imprimez seulement la ligne correspondante sans le '# 'pas très utile sans imprimer toutes les lignes dans le fichier. –

0

est ici d'une manière utilisant sed:

sed '/sufficient \+pam_wheel.so \+trust \+use_uid/s/^#//' file 

Résultats:

#%PAM-1.0 
auth   sufficient  pam_rootok.so 
# Uncomment the following line to implicitly trust users in the "wheel" group. 
auth   sufficient  pam_wheel.so trust use_uid 
auth   include   system-auth 
account   sufficient  pam_succeed_if.so uid = 0 use_uid quiet 
1
perl -pi -e '$_=~s/^.//g if(/sufficient  pam_wheel.so trust use_uid/)' your_file 

Note: Ceci ne inplace replacement.so après avoir exécuté la commande de votre fichier sera modifié automatiquement.

0

Les commandes sed ne peuvent faire que des correspondances RE et non des comparaisons de chaînes. Pour utiliser sed, vous devez analyser votre chaîne désirée afin d'échapper tous les métacaractères RE qui sont sujets aux erreurs (par ex.les solutions actuellement publiées négligent toutes d'échapper au "." en pam_wheel.so).

Mieux vaut juste faire une comparaison de chaînes lorsque vous essayez de faire correspondre une chaîne, par exemple:

awk 'index($0,"sufficient pam_wheel.so trust use_uid"){sub/^#/,"")}1' file > tmp && mv tmp file 
Questions connexes