Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed:替换'之前的字符-';_Sed - Fatal编程技术网

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,只做了一些细微的更改。