sed:替换'之前的字符-';
我有一个这样的文本文件:sed:替换'之前的字符-';,sed,Sed,我有一个这样的文本文件: every- 100 atmo- 220 我想用*替换-之前的字符。因此,预期的输出应该是 *****- 100 ****- 220 我将如何使用sed实现这一点? 我尝试过使用s/[a-z]*-/*/g,但它不起作用,它将以前的-替换为一个* 如何解决此问题?使用标签和分支实现循环: $ sed ':1; s/^\(\**\)[a-z]/\1*/; t1' <<EOF every- 100 atmo- 220 EOF **
every- 100
atmo- 220
我想用*
替换-
之前的字符。因此,预期的输出应该是
*****- 100
****- 220
我将如何使用sed实现这一点?我尝试过使用
s/[a-z]*-/*/g
,但它不起作用,它将以前的-
替换为一个*
如何解决此问题?使用标签和分支实现循环:
$ sed ':1; s/^\(\**\)[a-z]/\1*/; t1' <<EOF
every- 100
atmo- 220
EOF
*****- 100
****- 220
$sed]:1;s/^\(\**\)[a-z]/\1*/;t1'与Perl:
perl -pe 's/.(?=.*-)/*/g' file
输出:
*****- 100
****- 220
*****- 100
****- 220
*****- 100
****- 220
源自GNU awk的。使用-
作为输入和输出字段分隔符,并将第一列中的所有内容替换为*
gawk 'BEGIN{FS=OFS="-"} gsub(/./,"*",$1)' file
输出:
*****- 100
****- 220
*****- 100
****- 220
*****- 100
****- 220
在sed
中对其进行编码的另一种方法:
$ sed ':loop ; /[^*]-/s/[^*]/*/ ; t loop' <<END
every- 100
atmo- 220
END
*****- 100
****- 220
这可能适用于您(GNU-sed):
这将使用换行符作为分隔符,并使用副本来实现所需的结果
- 用换行符替换
-
- 抄这行
- 用
*
替换除换行符以外的所有内容
- 附加副本
- 用一个
-
替换换行符之间的所有内容
另一种方法是使用循环:
sed ':a;s/^\(\**\)[^-*]/\1*/;ta' file
我想这不是在检查是否只替换字母,它也会替换-
之前的任何整数或字符。如果您不介意的话,我从您的这个解决方案中获得了灵感,并在我的解决方案中添加了1,只做了一些细微的更改。