我正在使用, 并在字段awk
上键入,但根据 FieldSeperator ( ) 是否开始该行,或者在它之前有一个空格,或者在它之前没有空格,其行为会有所不同。$1
$2
awk
$match
我认为这sed
是我完成这项特定任务的最佳选择,但需要一些帮助。我认为通过一些简单的搜索就可以得到这个,尽管我已经看到了很多替换整行的示例,但我还没有找到下面需要做的事情。如果有人能够帮助我,我将不胜感激。
我想指定一个变量 ( $match
),该变量设置为我想要查找的匹配项 ( password=
)。这实际上将在一个批处理脚本中,我将在其中循环遍历各种模式。
我想打印:
- 仅包含匹配的行。忽略没有匹配的行。
- 打印直到并包括该行的第一个匹配值
- 如果匹配后有任何值,则将其替换为
masked
- 如果匹配后没有任何内容,则按原样打印行(或替换为
empty
) - 不区分大小写地搜索匹配项。
输入文件.txt
dummy line
mypassword=123
PASSWORD=1234
secret password=2345 2ndpassword=99485
password=
nothing to see move along
end of file
所需输出
mypassword=masked
PASSWORD=masked
secret password=masked
password=
答案1
怎么样
$ sed -nE '/(password|PASSWORD)=/{s/=.+/=masked/;p;}' infile.txt
mypassword=masked
PASSWORD=masked
secret password=masked
password=
- 匹配
password=
或PASSWORD=
- 替换之后的任何非空字符序列
=
- 打印结果
使用 GNU sed,您可以使用修饰符简化不区分大小写的匹配I
:
sed -nE '/password=/I{s/=.+/=masked/;p;}' infile.txt
答案2
在“防御”中awk
,假设您awk
了解IGNORECASE
内部标志和 POSIX 字符类(这可能会将其限制为 GNU Awk),则应该执行以下操作:
awk -v pat="$match" 'BEGIN{IGNORECASE=1;w=length(pat)} i=index($0,pat) {printf "%s%s%s",substr($0,1,i+w-1),substr($0,i+w)~/^[[:space:]]*$/ ? "" : "masked",ORS}' infile.txt
这会将 shell 变量导入$match
到awk
变量中pat
。在本BEGIN
节中,IGNORECASE
将设置标志来指示awk
忽略匹配中的大小写。
它只会处理index()
函数可以成功定位搜索模式的行(我选择进行文字字符串匹配而不是正则表达式匹配,以防止$match
变量中具有特殊含义的字符 -match()
如果需要正则表达式搜索,请使用该函数) 。在这种情况下,它将打印从开头到模式(包括模式)的行,然后是单词masked
,除非该行的其余部分仅由空格组成。
更便携的变体将在执行搜索之前使用该tolower()
函数将行转换为小写index()
(因此,请确保$match
变量包含全小写的搜索字符串),并且不使用 POSIX 字符类:
awk -v pat="$match" 'BEGIN{w=length(pat)} i=index(tolower($0),pat) {printf "%s%s%s",substr($0,1,i+w-1),substr($0,i+w)~/^[ \t]*$/ ? "" : "masked",ORS}' infile.txt
这应该适用于 的所有变体awk
。
答案3
使用sed
$ sed -n '/password=/I{/=[[:alnum:]]/{s/\([^=]*=\).*/\1masked/};p}' input_file
mypassword=masked
PASSWORD=masked
secret password=masked
password=
答案4
使用 GNU sed 及其/I
修饰符来实现不区分大小写。
##> ensure $match is pluggable
## on the kha of a s/// and/or
## /../
match='password='
match_lhs=$(printf '%s\n' "$match" | sed -e 's:[*[$.\^/]:\\&:g')
sed -n "
/$match_lhs\$/Ip
s/\($match_lhs\)..*/\1MASKED/Ip
" infile.txt
mypassword=MASKED
PASSWORD=MASKED
secret password=MASKED
password=