2012-12-10 126 views
0

我想在grep某个字符串时删除文件中的第一个字符。但需要在编辑之前将行更改为相同的位置。Grep字符串并删除第一个字符

示例文件:

#%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 

编辑后预计查看:

#%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 

在对第4行这种情况下,需要的正好删除“#”,但我想这样做,当搜索字符串“足够pam_wheel.so信任use_uid”不当指向我想要编辑的确切行。

回答

4

这是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 

所以我们实际上是匹配的行开始与包含字符串sufficient\s+pam_wheel.so trust use_uid和去除#

注意#-r标志用于扩展正则表达式,它可能是-E对于您的sed版本,请检查man

如果你想保存更改回file使用-i选项:

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

如果列aligment是很重要的,然后捕捉高达sufficient,它让你获得2个捕获组,代之以后\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 

编辑:

#AllowUsers support admin替换字符串AllowUsers support admin

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

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

很好的例子,由于@sudo_O –

+0

另一种情况下,如果我有一个文件: '的AllowUsers支持admin' 如何使该文件是: '#AllowUsers支持admin' 'DeniedUsers root' –

+0

实际上 DeniedUsers根 是一条新的线路可能是好的更换整列W包含AllowUsers –

0

使用awk的,你可以这样做:

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

或者(如果只能有一个#开头):

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

报价',但我想要这样做时,搜索字符串“足够pam_wheel.so信任use_uid”不指向时,我想编辑确切的行' –

+0

@sudo_O:感谢指出这虽然它仍然可以在一个简单的awk命令。请现在检查编辑的答案。 – anubhava

+0

更好,但你只打印匹配的行而不用'#'不是非常有用,而不打印文件中的所有行。 –

0

下面是使用sed一个办法:

sed '/sufficient \+pam_wheel.so \+trust \+use_uid/s/^#//' 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 
1
perl -pi -e '$_=~s/^.//g if(/sufficient  pam_wheel.so trust use_uid/)' your_file 

注:这会做就地replacement.so运行该命令后,你的文件会自动修改。

0

sed命令只能执行RE匹配而不是字符串比较,所以要使用sed,您需要解析所需的字符串以转义所有容易出错的RE元字符(例如,目前发布的解决方案都忽略了逃避“。”。在pam_wheel.so)。

更好的只是做当你试图匹配字符串字符串比较,如:

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