【问题标题】:sed not working on a variable within a bash script; requesting a file. Simple examplesed 不能处理 bash 脚本中的变量;请求文件。简单的例子
【发布时间】:2019-04-13 12:03:32
【问题描述】:

如果我在 bash 脚本中声明一个变量,然后尝试使用 sed 对其进行操作,我会不断收到错误消息。我尝试过在变量上使用双引号、反引号并避免使用单引号。这就是我本质上在做的事情。

使用多个参数调用我的脚本

./myScript.sh apples oranges ilike,apples,oranges,bananas

我的目标是使用 sed 将 $3 "," 替换为 " ",然后使用 wc -w 计算 $3 中有多少单词。

MyScript.sh

fruits="$3"
checkFruits= sed -i 's/,/ /g' <<< "$fruits"
echo $checkFruits

以及在终端运行脚本后的结果:

ilike,apples,oranges,bananas
sed: no input files

附:在无数次谷歌搜索、阅读建议和使用我的代码之后,我根本无法让这个简单的代码示例工作,我也不确定为什么。在我越过这个块之前,我无法尝试实现 wc -w 。

【问题讨论】:

    标签: linux bash variables unix sed


    【解决方案1】:

    你根本不需要sed

    IFS=, read -a things <<< "$3"
    echo "${#things[@]}"
    

    【讨论】:

      【解决方案2】:

      -i 选项用于就地编辑输入文件,这里不需要它。

      要将命令的输出分配给变量,请使用命令扩展,例如 var=$(command)

      fruits="$3"
      checkFruits=$(sed 's/,/ /g' <<< "$fruits")
      echo $checkFruits
      

      【讨论】:

        【解决方案3】:

        你可以的

        fruits="$3"
        checkFruits="${3//,/ }"
        # or 
        echo "${3//,/ }"
        

        【讨论】:

        • 是的,我完全忘记了 bash 的内置字符串替换。对于所展示的用例,这优于sedtr
        【解决方案4】:

        sed 的 -i 标志需要一个文件参数,没有它,sed 命令会执行您所期望的操作。

        但是,我会考虑使用 tr 而不是 sed 来进行这个简单的替换:

        fruits="$3"
        checkFruits="$(tr , ' ' <<< $fruits)"
        echo $checkFruits
        

        纵观全局,您是想计算逗号分隔的字符串,还是将逗号更改为空格后的单词数?例如,您希望字符串 "i like,apples,oranges,and bananas" 返回 4 还是 6? (如果您 100% 确定输入数据中永远不会有空格,则此问题没有实际意义。)

        如果是 6,那么其他答案(包括我的)已经可以了。

        但是,如果您希望答案为 4,那么您可能需要执行其他操作,例如:

        fruits="$3"
        checkFruits="$(tr , \\n <<< $fruits)"
        itemCount="$(wc -l <<< $checkFruits)"
        

        当然,这可以浓缩一点,但只是抛出关于你真正在做什么的问题。在这里提出问题时,最好将您的预期结果与输入数据和您已经用来尝试解决问题的代码一起发布。

        【讨论】:

        • -i 仅在 macOS 上需要 extension 参数,在 Linux 上不需要
        • 在 Ubuntu 18.04 上使用 -i 给出了与 OP 描述的相同的错误。
        • 正是我需要的。谢谢!很遗憾,不能投票给你。
        • @Karim 你应该可以接受答案(点击答案旁边的复选标记):stackoverflow.com/help/someone-answers
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2017-04-03
        相关资源
        最近更新 更多