【问题标题】:Replace all Occurences of '.' with '_' before '=' using sed替换所有出现的“。”在 '=' 之前使用 '_' 使用 sed
【发布时间】:2015-01-08 18:20:13
【问题描述】:

我有一个属性文件如下:

build.number=153013
db.create.tablespace=0
db.create.user=0
db.create.schema=0
upgrade.install=1
new.install=0
configure.jboss=0
configure.jbosseap=false
configure.weblogic=1
configure.websphere=0

我需要将这些变量导入到 shell 脚本中。如你所知, '。'不是在 linux 中用作变量的有效字符。我将如何使用 sed 替换所有出现的“。”在 '=' 和 '_' 之前。我已经替换了所有出现的“。”但是有些属性的值包含“。”我不想修改。

感谢任何帮助!

谢谢!

【问题讨论】:

  • 展示自己尝试过的东西很好,这样其他人就会看到您尝试过的东西,而不是简单地要求别人做您的工作——事实并非如此,对吧? :D
  • 等号前是否总是至少有一个点?
  • 这是我尝试过的:“sed 'y/./_/' $TEMP_FOLDER/$FILE_NAME_WITHOUT_MIME_TYPE/build.properties >> $TEMP_FOLDER/$FILE_NAME_WITHOUT_MIME_TYPE/build.properties.temp”跨度>
  • 为什么“使用 sed”?你怎么知道sed 是适合这项工作的工具?我的第一直觉是使用本机 bash 参数扩展。也可以用 awk 来完成...很多不是 sed 的工具,还有很多可能的答案,你在没有任何明显原因的情况下排除了。
  • 我不确定是不是这样。就我而言,为什么我会受益于 awk 而不是 sed 命令?

标签: regex linux bash unix sed


【解决方案1】:

你可以试试这个:

sed 's/\.\|\(=.*\)/_\1/g;s/_=/=/' file

该方法包括捕获等于后的所有内容以消耗所有尾随字符(包括可能的点)。所以等号之前的所有点都被替换为下划线和一个空的捕获组,但是等号之前有一个下划线。第二个替换删除了最后一个下划线。

【讨论】:

  • 感谢您的解决方案,您能解释一下该语句的逻辑吗?
【解决方案2】:

你可以使用

sed -e ':b; s/^\([^=]*\)*\./\1_/; tb;'

只要匹配成功,它就会将stringWithoutEquals. 替换为stringWithoutEquals_。实际上,这会将= 之前的所有. 替换为_

【讨论】:

  • 感谢您的解释和解决方案!什么是:b;一个标志?
  • @VarunPatel 这是一个名为b 的标签。 tb 表示“如果成功,跳转到标签b”
  • -e 不需要,因为你有一组代码/脚本
【解决方案3】:

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

sed 's/=/&\n/;h;y/./_/;G;s/\n.*\n//' file

= 处用标记分隔行。复制该行。将所有. 替换为_。追加原始行并减去两个标记之间的文本。

【讨论】:

    【解决方案4】:

    这是awk

    awk -F= '{gsub(/\./,"_",$1)}1' OFS== file
    build_number=153013
    db_create_tablespace=0
    db_create_user=0
    db_create_schema=0
    upgrade_install=1
    new_install=0
    configure_jboss=0
    configure_jbosseap=false
    configure_weblogic=1
    configure_websphere=0
    

    它将文本除以=,然后将第一个字段中的. 替换为_

    【讨论】:

    • awk 与 sed 相比有什么优势?
    • awksed 复杂得多,并且可能更容易阅读正在发生的事情。对于简单的东西sed 可能会更好。谷歌搜索sed vs awk
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多