sed 替换匹配后的文本

sed 替换匹配后的文本

我正在使用, 并在字段awk上键入,但根据 FieldSeperator ( ) 是否开始该行,或者在它之前有一个空格,或者在它之前没有空格,其行为会有所不同。$1 $2awk$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 变量导入$matchawk变量中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=

相关内容