Unix 使用sed替换所有以';开头的字符串;xy';长度为5或以上

Unix 使用sed替换所有以';开头的字符串;xy';长度为5或以上,unix,sed,aix,Unix,Sed,Aix,我正在运行AIX6.1 我有一个文件,其中包含以某些特定字符开头的字符串/单词,比如“xy”或“xy”或“xy”或“xy”(不区分大小写),如果单词大于5个字符,我需要用星号“*”屏蔽整个单词/字符串 e、 我需要一个sed命令,当对包含以下行的文件运行时 This is a test line xy12345 xy12 Xy123 Xy11111 which I need to replace specific strings 应给出以下作为输出 This is a test line

我正在运行AIX6.1

我有一个文件,其中包含以某些特定字符开头的字符串/单词,比如“xy”或“xy”或“xy”或“xy”(不区分大小写),如果单词大于5个字符,我需要用星号“*”屏蔽整个单词/字符串

e、 我需要一个sed命令,当对包含以下行的文件运行时

This is a test line  xy12345  xy12  Xy123 Xy11111 which I need to replace specific strings
应给出以下作为输出

This is a test line xy12 which I need to replace specific strings
我尝试了下面的命令(还没有达到限制字长的阶段),但它不起作用,显示完整的行,没有任何替换

我尝试使用\<和>以及\b进行单词识别

sed 's/\<xy\(.*\)\>/******/g' result2.csv
sed 's/\bxy\(.*\)\b******/g' result2.csv
sed's/\/*****/g'result2.csv
sed的/\bxy\(.*\)\b******/g'result2.csv
您可以尝试使用awk:

echo 'This is a test line  xy12345  xy12  Xy123 Xy11111 which I need to replace specific strings' | awk 'BEGIN{RS=ORS=" "} !(/^[xX][yY]/ && length($0)>=5)'
awk记录分隔符设置为空格,以便能够获得每个字的长度


这在
--posix
--traditional
模式下与GNU awk一起工作。

使用sed进行心理训练

sed -E '
  s/(^|[[:blank:]])([xyXY])([xyXY].{2}[^[:space:]]*)([^[:space:]])/\1@\3@/g
  :A
  s/(@[^@[:blank:]]*)[^@[:blank:]](@[@]*)/\1@\2/g
  tA
  s/@/*/g'

文本中不需要@。

您可以使用
awk

s='This is a test line  xy12345  xy12  Xy123 Xy11111 which I need to replace specific strings xy123 xy1234 xy12345 xy123456 xy1234567'
echo "$s" | awk 'BEGIN {
    ORS=RS=" "
} 
{ 
    for(i=1;i<=NF;i++) {
        if(length($i) >= 5 && $i~/^[Xx][Yy][a-zA-Z0-9]+$/) 
            gsub(/./,"*", $i);
            print $i;
    } 
}'
s='这是一个测试行xy12345 xy12 Xy123 Xy11111,我需要它来替换特定的字符串Xy123 xy1234 xy12345 xy123456 xy1234567'
回声“$s”| awk”开始{
ORS=RS=“”
} 
{ 
(i=1;i=5&&$i~/^[Xx][Yy][a-zA-Z0-9]+$/)
gsub(/./,“*”,$i);
打印$i;
} 
}'
一行:

awk 'BEGIN {ORS=RS=" "} { for(i=1;i<=NF;i++) {if(length($i) >= 5 && $i~/^[Xx][Yy][a-zA-Z0-9]+$/) gsub(/./,"*", $i); print $i; } }'
# => This is a test line ******* xy12 ***** ******* which I need to replace specific strings ***** ****** ******* ******** *********
awk'BEGIN{ORS=RS=”“}{for(i=1;i=5&&$i~/^[Xx][Yy][a-zA-Z0-9]+$/)gsub(/./,“*”,$i);print$i;}'
#=>这是一个测试行*************xy12****************我需要替换特定的字符串*****************************************

详细信息

  • BEGIN{ORS=RS=”“}
    -开始
    awk
    :将输出记录分隔符设置为等于空格记录分隔符
  • {for(i=1;i=5&&$i~/^xy[a-zA-Z0-9]+$/)gsub(/./,“*”,$i);print$i;}}
    -在每个字段上迭代(对于(i=1;i=5),它匹配
    xy
    和(
    &
    )1个或更多字母数字字符模式(
    $i~/^[Xx][Yy Yy][a-zA Z0-9]//code>),然后用替换为
    )(/。/,“*”,$i)
    )然后打印当前字段值

    • 一个简单的POSIX
      awk
      版本:

      awk '{for(i=1;i<=NF;++i) if ($i ~ /^[xX][yY]/ && length($i)>=5) gsub(/./,"*",$i)}1'
      
      这可能适用于您(GNU-sed):

      如果当前行不包含以
      xy
      不区分大小写开头的字符串和后面的5个或更多字符,则无需执行任何操作

      否则:

    • 用新行环绕字符串
    • 将图案空间(PS)复制到保留空间(HS)
    • 将除换行符以外的所有字符替换为
      *
    • 将PS附加到HS
    • 将PS更换为HS
    • 在保留第一行剩余部分的换行符之间交换字符串
    • 重复

    • 如果您的代码> SED不是GNU<代码> SED,您应该考虑使用其他工具。谢谢您的响应。我也可以使用任何其他命令。请建议。我不确定我的SED是否GNU SED。请参阅在线演示。谢谢您的响应。这很有用。但是…1。它以XY/XY等开始删除单词。d不能替换为*2。单词之间的分隔符可以是空格、逗号,甚至可以是每行的第一个或最后一个单词。@Sora此脚本输出的字符串与您的问题中的字符串相同。如果您有其他要求,请使用包含所有不同大小写的示例更新您的问题。@kvantour好,转到
      xy
      转换成
      [Xx][Yy]
      不是问题。
      awk 'BEGIN{RS=ORS=" "}(/^[xX][yY]/ && length($i)>=5){gsub(/./,"*")}1'
      
      sed -r ':a;/\bxy\S{5,}\b/I!b;s//\n&\n/;h;s/[^\n]/*/g;H;g;s/\n.*\n(.*)\n.*\n(.*)\n.*/\2\1/;ta' file