Unix 使用sed替换所有以';开头的字符串;xy';长度为5或以上
我正在运行AIX6.1 我有一个文件,其中包含以某些特定字符开头的字符串/单词,比如“xy”或“xy”或“xy”或“xy”(不区分大小写),如果单词大于5个字符,我需要用星号“*”屏蔽整个单词/字符串 e、 我需要一个sed命令,当对包含以下行的文件运行时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
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
-在每个字段上迭代(对于(i=1;i=5),它匹配{for(i=1;i=5&&$i~/^xy[a-zA-Z0-9]+$/)gsub(/./,“*”,$i);print$i;}}
和(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个或更多字符,则无需执行任何操作
否则:
*
如果您的代码> 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