将文本附加到不包含模式的第一行?

时间:2017-12-11 21:58:08

标签: unix awk sed

我想使用诸如sedawk之类的Unix命令将字符串"#DONE"附加到尚未包含字符串{{}的文本文件的第一行的末尾。 1}}。

例如,输入文件类似于

"#DONE"

,所需的输出将是

qsub job1.sh #DONE
qsub job2.sh #DONE
qsub job3.sh 
qsub job4.sh 

我对这种类型的脚本没有经验,而且我已经搜索过,但无法在SO上找到确切的解决方案。

4 个答案:

答案 0 :(得分:3)

O(n*logn) 方法:

Awk

输出:

awk '!f && !/#DONE$/{ $0=$0 "#DONE"; f=1 }1' file

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed '/#DONE$/!{s/$/#DONE/;:a;n;ba}' file

#DONE附加到没有它的第一行,然后打印文件的其余部分。

答案 2 :(得分:2)

另一个awk

awk -v k="#DONE" '$NF!=k && !c++{$++NF=k}1' file

!c++将确保仅执行一次,$++NF=k增加字段数,并将最后一个字段设置为该值。

答案 3 :(得分:0)

管道aproach grep -nrv -m1 "#DONE" "file" | awk -F ":" '{print $2}' | xargs -I {} awk 'FNR=={},FNR=={}{$3="#DONE"};1' "$1" >tmp && mv tmp "file" 是您的文件(放置两次)

"data": {
        "title": "stack",
        "notes": "asdsad",
        "time": "19:02",
        "meridian": "PM",
        "type": "Education",
        "_id": "5a2f02d3bba3640337bc92c9",
        "days": {
            "Monday": true,
            "Tuesday": false,
            "Wednesday": false,
            "Thursday": false,
            "Friday": false,
            "Saturday": false,
            "Sunday": false
        }
    }

只要您不完全是#DONE,这将有效。

如果发生这种情况,文件将被清空:-)

尚未想出那个

相关问题