【问题标题】:Shell script for replacing characters?用于替换字符的 shell 脚本?
【发布时间】:2016-12-03 07:53:48
【问题描述】:

我正在尝试编写一个 shell 脚本,它接收一个文件(例如 file_1_2.txt)并将任何“_”替换为“.”(例如 file.1.2.txt)。这就是我所拥有的,但是当我运行它时它给了我一个空白输出。

read $var
x= `echo $var | sed 's/\./_/g'`
echo $x

我正在尝试将更改后的文件名存储在变量“x”中,然后将 x 输出到控制台。

我通过写来调用这个脚本

./script2.sh < file_1_2.txt

【问题讨论】:

  • 您是否尝试删除x= 和其余命令之间的空格?
  • 如果我这样做仍然没有输出。
  • 嗯还可以尝试删除read 行上的$:read var 而不是read $var。这对我有用。
  • 还是什么都没有。我在 bash 中运行它,这有什么不同吗?编辑:在没有加载 bash 的情况下尝试过,它是一样的。只是一个空行输出。
  • 我想您确实检查了您的file_1_2.txt 是否为空?好吧,删除了空格和$,这对我来说对bash来说很好,所以我不能真正帮助你,对不起:-/

标签: bash shell


【解决方案1】:

有两个问题。首先,您的代码有一些错误:

read var
x=`echo $var | sed 's/_/\./g'`
echo $x

会起作用。你在read var 中有一个额外的$,一个空格太多(如前所述)并且你在 sed 中混淆了替换模式(它正在做你想要的相反)。

此外,如果您想将文件名中的_ 替换为.,您应该这样做

echo "file_1_2.txt" | ./script2.sh

如果您使用&lt;,这会将“file_1_2.txt”的内容读入您的脚本中。

【讨论】:

  • 这可以得到输出“file.1.2.txt”,这是朝着正确方向迈出的一步,但它实际上并没有改变文件名本身。那我该怎么做那部分呢?编辑:没关系。知道了。 “mv $var $x”。感谢您的帮助!
  • 更简单。使用rename 或仅使用prename:rename "s/_/\./g" *.txt。只需在包含 txt 文件的文件夹中的终端中运行它,它就会重命名它们。
  • 抱歉@Tremors 我不明白你想处理文件名,我以为你想阅读它的内容。也很抱歉@CDe,在看到你的评论之前,我用rename 发布了我的解决方案。
【解决方案2】:

另一种解决方案,仅使用 bash:

$ x=file_1_2.txt; echo "${x//_/.}"
file.1.2.txt

(详见bash手册“参数扩展”部分)

您也可以使用rename:

$ touch file_1_2.txt
$ ls file*
file_1_2.txt
$ rename 'y/_/\./' file_1_2.txt
$ ls file*
file.1.2.txt

【讨论】:

    【解决方案3】:

    不需要sed,因为 bash 支持变量替换:

    $ cat ./script2
    #!/bin/bash
    ofile=$1
    nfile=${ofile//_/./}
    echo mv "$ofile" "$nfile"
    $ ./script2 file_1_2.txt
    mv "file_1_2.txt" "file.1.2.txt"
    

    如果您对结果满意,请删除echo。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2016-09-03
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多