【问题标题】:Replace a line of a file with a blank line in shell script? [duplicate]用shell脚本中的空行替换文件的一行? [复制]
【发布时间】:2017-05-03 02:47:55
【问题描述】:

我有一个名为 catalog 的文本文件,其中每一行都有一个名字、一个姓氏、一个城市和一个电话号码,如下所示:

John McJohn Detroit 0301234568
Donald Duck Lake_City 1234567890
Deez Nutz Oxford 2305985531

我想编写一个脚本,它将关键字作为参数,并将其行替换为带有空行的关键字。

这是我到目前为止的地方:

t1=$(grep $2 catalog)      #$2 is the keyword
echo the lines with that keyword are:
echo $t1

t2=$(echo)                       #a blank line

t3=$(tr '$t1' '$t2' < catalog)  #replacing each line with the keyword with a space

echo The lines have been deleted  #not really, they have been replaced with a space

cat catalog

这根本不会改变文件。

我已经尝试了许多 sed 的表达方式,但没有任何运气(我在旧的 xubuntu 版本上运行脚本,所以我不知道 sed 是否应该适用于此)。

我试图用 '\n' 替换 "t2=$(echo)" 的东西,但如果失败了。

这是怎么做到的? 是否可以用模式将每一行替换为空白行?

(可能且“工作正常”的答案:

t1=$(grep $2 catalog)     
echo the lines with that keyword are:
echo $t1
sed "./*$t1.*/s///" catalog
sed "./*$t1.*/s///" catalog > catalogtemp
mv catalogtemp catalog

)

【问题讨论】:

  • @pvg ive 将 t3=$(tr ...) 替换为 t3=$(sed "s/$t1/$t2/g")。它没有工作
  • 单次调用 sed 就可以做到这一点,你不需要其他任何东西。链接的答案之一与您的问题相同,使用它。

标签: linux bash shell ubuntu sed


【解决方案1】:

使用awk:

awk -v key="${the_key}" '$0 ~ key{$0=""}1' file

我将 shell 变量 ${the_key} 作为参数传递给 awk。 awk 将整行 ($0) 与键匹配,如果匹配,则将整行设置为空字符串。最后的1 将始终评估为true 并使awk 打印所有输入行,无论是否修改。

【讨论】:

    【解决方案2】:

    使用 sed:

    $ t1="Donald";
    $ sed "s/.*$t1.*//" file
    John McJohn Detroit 0301234568
    
    Deez Nutz Oxford 2305985531
    

    要编辑文件就地,请使用-i fag:

    sed -i "s/.*$t1.*//" file
    

    编辑:

    更安全的语法以避免不必要的参数扩展:

    sed 's/.*'"$t1"'.*//' file
    

    【讨论】:

    • $kw 等于我上面写的$t1 吗?
    • 是的,我编辑了答案。
    • 在您的帮助下,我对代码进行了一些更改,如下所示:t3=$(sed "/,*$2.*/s///" catalog) 然后我移动了结果t3 到“目录”如下: echo $t3 > catalogtemp; mv catalog2 目录。现在换行符消失了。所有文本都在第一行。怎么了?
    • tr 仅用于翻译或删除单个字符。不要将它与模式一起使用。 sed 就足够了。
    • 我刚刚开始工作,你是对的。谢谢你。我将用正确的答案更新问题。
    【解决方案3】:

    你可以在oneliner中做到这一点:

    sed -i "s/^.*<keyword>.*$//" <filename>
    

    因此,如果您的文件名为 catalog 并且您的关键字是 Donald,则脚本将是:

    #!/bin/bash
    # Should be [[ "$1" == "" ]], leaving the previous
    # version for comments to be valid
    if [ "x$1" == "x" ]; then
        exit 1
    fi
    sed -i "s/^.*${1}.*$//" calatog
    

    你可以把脚本称为

    ./<script_name> Donald
    

    【讨论】:

    • 我真的无法得到 if 语句。 "x$1" == "x" 有什么作用?
    • 与 bash 一起使用:[[ "$1" == "" ]]
    • @Coursal - 检查脚本是否有参数。 “x”只是一个预防措施,因此如果 $1 以“-”开头,则它不会被解释为选项。如果 $1 为“-d”,则测试将尝试检查 == 是否为目录。
    • @Cyrus 你是对的,谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2014-06-28
    相关资源
    最近更新 更多