【问题标题】:String substitute in Shell scriptShell 脚本中的字符串替换
【发布时间】:2014-11-24 16:24:17
【问题描述】:

我想在我的 shell 脚本中删除一个子字符串。我正在尝试如下:

fileName="Test_VSS_TT.csv.old"

这里我想删除字符串“.csv.old”和我的

test=${fileName%.*}

但是得到了错误的替换错误。

【问题讨论】:

  • 你试过test=${filename%%.*}吗? %% 返回最长的匹配模式。
  • 但是您尝试的命令应该已经从您的字符串中删除了.old 并导致TEST_VSS_TT.csv 而不是抛出错误,您是否仔细检查了您的命令? ,
  • 即使使用 %%,我的第一个问题仍然是同样的错误。我的系统是 Solaris sparc。

标签: bash shell unix


【解决方案1】:

您正在寻找test=${filename%%.*}

bash here 和 zsh here 中的参数扩展文档

%.* 将匹配第一个 .* 模式,而 %%.* 将匹配最长的一个

[编辑]

如果sed 可用,您可以尝试类似的方法:echo "filename.txt.bin" | sed "s/\..*//g" 产生filename

【讨论】:

  • @CrazyC: 你用的是什么外壳/版本?
  • Bash 版本是 3.2.51(1)-release
  • 奇怪。您能否从交互式 shell 中发布命令和错误消息的完整副本?
  • ./mytest.sh : 替换错误。如果我注释掉该行,则没有错误。
  • 你确定你的 sh 是 bash 吗? StackOverflow here 似乎有先例。另外,您是否尝试过使用 bash ./mytest.sh 启动脚本?
【解决方案2】:

给你,

$ echo $f
Test_VSS_TT.csv.old
$ test=${f%%.*}
$ echo $test
Test_VSS_TT

%% 将进行最长匹​​配。所以它从第一个点到最后一个点匹配,然后删除匹配的字符。

【讨论】:

  • 即使使用 %%,我的第一个问题仍然是同样的错误。我的系统是 Solaris sparc
【解决方案3】:

如果你的目的是提取没有扩展名的文件名,那么这个怎么样?

$ echo ${fileName}               
Test_VSS_TT.csv.old
$ test=`echo ${fileName} |cut -d '.' -f1`
$ echo $test
Test_VSS_TT

【讨论】:

    【解决方案4】:

    回显“Test_VSS_TT.csv.old”| awk -F"。" '{打印 $1}'

    【讨论】:

    • 最简单的方法,将结果保存在变量中,需要时使用
    • awk:第 1 行附近的语法错误 awk:在第 1 行附近退出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2012-11-02
    • 2017-05-05
    • 2017-11-17
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多