sed:替换“-”之前的字符

时间:2019-08-12 10:21:43

标签: sed

我有一个像这样的文本文件:

every-    100
atmo-   220

我希望将-之前的字符替换为*。因此,预期输出应为

*****-    100
****-   220

我该如何使用sed进行操作?
我尝试使用s/[a-z]*-/*/g,但是它不起作用,并且用单个-

替换了*并将其包括在内。

我该如何解决?

5 个答案:

答案 0 :(得分:2)

使用标签和分支实现循环:

$ sed ':1; s/^\(\**\)[a-z]/\1*/; t1' <<EOF
every-    100
atmo-   220
EOF
*****-    100
****-   220

答案 1 :(得分:1)

使用Perl:

perl -pe 's/.(?=.*-)/*/g' file

输出:

*****-    100
****-   220

源自https://stackoverflow.com/a/57458869/3776858

答案 2 :(得分:1)

使用GNU awk。使用-作为输入和输出字段分隔符,并在第一列中将所有内容替换为*

gawk 'BEGIN{FS=OFS="-"} gsub(/./,"*",$1)' file

输出:

*****-    100
****-   220

答案 3 :(得分:0)

sed中进行编码的另一种方式:

$ sed ':loop ; /[^*]-/s/[^*]/*/ ; t loop' <<END
every-    100
atmo-   220
END
*****-    100
****-   220

以及Perl中的替代编码:

perl -pe 's/[^*]/*/ while /[^*]-/'

答案 4 :(得分:-1)

这可能对您有用(GNU sed):

FROM openjdk:11
EXPOSE 9091
RUN apt-get update && apt-get install python3
ADD target/python-service-0.0.1-SNAPSHOT.jar python-service-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "python-service-0.0.1-SNAPSHOT.jar"]

这使用换行符作为分隔符,并使用副本获得所需的结果

  • 用换行符替换sed 's/-/\n/;h;s/[^\n]/*/g;G;s/\n.*\n/-/' file
  • 复制行。
  • -代替换行符。
  • 附加副本。
  • 用单个*替换换行符之间的所有内容。

使用循环的另一种选择:

-