我有一个包含设定格式的行的文件,使用分隔符。我想在第3个字段中识别字符串“password”的所有行并编辑它们。就像在,在它们的开头加上“#”。 我还想删除第4个字段的现有值。 我无法弄清楚如何做到这一点。它看起来应该能够分两步完成,但我无法解决它们。我正在使用unix shell,所以SED,AWK等。 该文件的示例行是:
database2|~|t1||~|${topuser.username}|~|topuser
database2|~|t1||~|${topuser.password}|~|H4rdt0Gu3ss
database2|~|t1||~|${loguser.username}|~|LOG
database2|~|t1||~|${loguser.password}|~|Ih4v3n01d34y0utry
# database2|~|t1||~|${open.var1}|~|connect
database2|~|t1||~|${tablespace}|~|gis_tbs1
有些可能已经被删除,而且分隔符是“|〜|”。 请帮忙。
答案 0 :(得分:1)
如果我理解你的问题,那么以下内容应该有效:
$ awk 'BEGIN{FS=OFS="\|"}$6~/password/{$6="# "$6;$NF=""}1' file
database2|~|t1||~|${topuser.username}|~|topuser
database2|~|t1||~|# ${topuser.password}|~|
database2|~|t1||~|${loguser.username}|~|LOG
database2|~|t1||~|# ${loguser.password}|~|
# database2|~|t1||~|${open.var1}|~|connect
database2|~|t1||~|${tablespace}|~|gis_tbs1
击> <击> 撞击>
如果你的意思是编辑,只需 #
,那么你可以这样做:< / p>
$ awk 'BEGIN{FS=OFS="\|"}$6~/password/{$NF="";$0="# "$0}1' file
database2|~|t1||~|${topuser.username}|~|topuser
# database2|~|t1||~|${topuser.password}|~|
database2|~|t1||~|${loguser.username}|~|LOG
# database2|~|t1||~|${loguser.password}|~|
# database2|~|t1||~|${open.var1}|~|connect
database2|~|t1||~|${tablespace}|~|gis_tbs1
答案 1 :(得分:1)
这是一个实现目标的Perl脚本:
#!/usr/bin/perl
use warnings;
use strict;
while (<DATA>) {
chomp;
my @fields = split /\|~\|/;
if ($fields[2] =~ /password/) {
$fields[0] = "# $fields[0]";
$fields[3] = '';
}
print join("|~|", @fields), "\n";
}
__DATA__
database2|~|t1||~|${topuser.username}|~|topuser
database2|~|t1||~|${topuser.password}|~|H4rdt0Gu3ss
database2|~|t1||~|${loguser.username}|~|LOG
database2|~|t1||~|${loguser.password}|~|Ih4v3n01d34y0utry
# database2|~|t1||~|${open.var1}|~|connect
# database2|~|t1||~|${tablespace}|~|gis_tbs1
以下是单行版本:
perl -F'/\|~\|/' -ane '$"="|~|"; if ($F[2] =~ /password/) { $F[0]="# $F[0]"; $F[3] = "\n"; } print "@F";' datafile