我需要更改包含某个字符串的unix文件的行

时间:2014-03-28 02:33:45

标签: linux shell sed awk ksh

我有一个包含设定格式的行的文件,使用分隔符。我想在第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

有些可能已经被删除,而且分隔符是“|〜|”。 请帮忙。

2 个答案:

答案 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