度假一排文本文件

时间:2015-12-02 13:47:47

标签: bash edit

computer0-1   computer0-2   computer0-3
computer0-10  computer0-5   computer0-6
computer0-2   computer0-7   computer0-3

这些保存在文本文件中。我想编写一个bash脚本来检查每一行:

  • 如果该行包含computer0-1,则在行的开头写下另一个computer0-1。例如:

    computer 0-1 computer0-10   computer0-5   computer0-1.
    
  • 如果该行包含computer0-7,则在行的开头写下另一个computer0-7

  • 如果该行包含computer0-10,则在行的开头写下另一个computer0-10

我尝试使用if和for循环,但我不知道如何编写它们。我很高兴。

我需要编写一个脚本来执行此操作,而且我是Linux中的新手。我怎样才能做到这一点?有没有简单的方法呢?

2 个答案:

答案 0 :(得分:2)

使用sed:

sed -e 's/^.*\b\(computer0-1\)\b/\1\t\0/' -e 's/^.*\b\(computer0-10\)\b/\1\t\0/' -e 's/^.*\b\(computer0-7\)\b/\1\t\0/' <file>

它会搜索该行中的computer0-1computer0-10computer0-7之一,如果找到,则会在该行的开头放置一份副本,然后是制表符其余部分。

详细说明:

s/<search>/<replace>/ replaces the <search>ed pattern with the <replace> expression
^ matches the start of the line
.* matches everything until the next pattern matches
\b is the word-boundary metacharacter : it matches the start and end of a word of [a-zA-Z_] characters
\(...\) groups a fragment of pattern. We can reference it later.
\1 is a back-reference to the first (and only) group defined earlier
\0 is a back-reference to the whole matched string

所以我们所做的是匹配搜索到的令牌(即computer0-1),同时确保它是一个完整的单词(computer0-1不应该与computer0-12匹配),然后我们重新创建匹配的字符串,将其附加到匹配的标记。

试运行:

$ echo """computer0-1   computer0-2   computer0-3
> computer0-10  computer0-5   computer0-6
> computer0-2   computer0-7   computer0-3""" > input

$ sed -e 's/^.*\b\(computer0-1\)\b/\1\t\0/' -e 's/^.*\b\(computer0-10\)\b/\1\t\0/' -e 's/^.*\b\(computer0-7\)\b/\1\t\0/' input
computer0-1     computer0-1   computer0-2   computer0-3
computer0-10    computer0-10  computer0-5   computer0-6
computer0-7     computer0-2   computer0-7   computer0-3

答案 1 :(得分:1)

canvas.on('mouse:down', function(e){ //check if you clicked on an object that exists canvas if(e.target != undefined){ if (clicks == 0) { var pointer=canvas.getPointer(event.e); console.log(pointer); x1 = pointer.x; y1 =pointer.y; console.log("Pointer Start " +x1 ,y1); clicks++; } else { var pointer2=canvas.getPointer(); console.log(pointer2); var endx=pointer2.x; var endy=pointer2.y; console.log("Pointer2 End " +endx ,endy); console.log("x and y"+x1,y1); var newwidth=pointer2.x- x1; var newheight=pointer2.y - y1; var rect=new fabric.Rect({ left:x1, top: y1, originX :'left', originY :'top', width:newwidth, height:newheight, selectable: true, evented:false, fill:'red', opacity :0.3 }); canvas.add(rect); canvas.renderAll(); clicks=0; } }); fabric.Image.fromURL('fedex.jpg', function (img) { canvas.add(img.set({ width: 700, height:350, left: 350, top: 175, selectable: false, })); }//end if }); 救援!

awk

请注意,此搜索按字段顺序进行,并且将打印第一个匹配项。如果键的优先级很重要(如果-1和-10在同一行上的匹配总是使用-1),你可以使用这个

$ awk '{for(i=1;i<=NF;i++) if($i~/computer0-(1|10|7)$/) print $i, $0}' file | column -t

computer0-1   computer0-1   computer0-2  computer0-3
computer0-10  computer0-10  computer0-5  computer0-6
computer0-7   computer0-2   computer0-7  computer0-3