2017-10-31 2 views
2

私は、WindowsのコマンドICACLS cの結果である。このようなファイルがあります:\パスを/トン> output.txtとawkが前の行に基づいて行に空のスペースを置き換えるためにsedを

C:\temp\2\ok Everyone:(I)(RX) 
       BUILTIN\Administrators:(I)(F) 
       NT AUTHORITY\SYSTEM:(I)(F) 
       BUILTIN\Users:(I)(RX) 
       NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
        BUILTIN\Administrators:(I)(F) 
        NT AUTHORITY\SYSTEM:(I)(F) 
        BUILTIN\Users:(I)(RX) 
        NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

私はそれが完全に空ではない空のスペースに先行する行を挿入する必要があります。良いことは、空のスペースは常に前の行に基づく文字数と同じであることです。

所望の出力

私はこのような何かしようとした
C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
    C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
    C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
    C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 

:2つのファイルを入手し、それらを一緒に貼り付けるために をしかし、問題は、予想外のスペースalwatsは私がWindowsのawkを使用していることをsedをしています(オーダーネジことです私は二重引用符)

awk "{line=$2} {print NF?line:\"\"}" OUTPUT 
    awk "{line=$1} {print NF?line:\"\"}" OUTPUT 
    awk -F":" "{line=$2} {print NF?line:\"\"}" OUTPUT 
    awk -F":" "{line=$1} {print NF?line:\"\"}" OUTPUT 

を使用する理由私はに続いて、他のアイデア

+0

が実際に左揃えで "最初" の行されている他の方法でのawkを試してみましょうファイル、またはそれらの前にスペースがありますか? – ghoti

+0

これらのスペースは間違って追加されましたが、実際にはスペースはありません – Eduardo

+0

@Eduardo:あなたのスタートラインは常に 'Everyone:(I)(RX)'を持っていますか? – batMan

答えて

0

を理解するだろうさは同じことをお手伝いします。

awk '/^C:\\/{val=$1;print;next} NF{sub(/^ +/,"");print val,$0;next} 1' Input_file 

解決策の1つではなく、ここで説明を追加してください。

awk ' 
/^C:\\/{   ##Checking condition here if any line starts from C:\\, point to be noted here I am escaping \ for removing its special meaning. 
val=$1;   ##If any line starts from C:\\ then it will be come in this block, assigning variable named val to first field here. 
print;   ##Printing that specific line now. 
next   ##next is to skip all further statements from this line onwards and move the cursor to next line with starting of the statements. 
} 
NF{    ##Checking condition here if any line is NOT NULL so NF means number of fields and checking of number of fields variable is NOT NULL, if yes then do following. 
sub(/^ +/,""); ##Substituting initial space with NULL in current line. 
print val,$0; ##Printing variable named val and current line now. 
next    ##Use next statement to skip further statements. 
} 
1    ##Mentioning 1 here to make the condition TRUE, so awk works on method of regexp and action, here I am making condition/regexp TRUE by mentioning 1 and not mentioning any action here so by default print of current line will happen. 
' Input_file  ##Mentioning Input_file name here. 
+1

ありがとう、それは正確に必要な動作します。私はUNCのパスに適合させました。 – Eduardo

+0

@エドゥアルド、それはあなたを助けてくれたことをうれしく思います。 – RavinderSingh13

3

awkレスキュー!

awk '/^$/{k=""} !k{k=$1;$1=""} {sub(/^ +/,k FS)}1' 


C:\temp\2\ok Everyone:(I)(RX) 
C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok BUILTIN\Users:(I)(RX) 
C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok.txt Everyone:(I)(RX) 
C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok1.txt Everyone:(I)(RX) 
C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok2.txt Everyone:(I)(RX) 
C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\test1.ps1 Everyone:(I)(RX) 
C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 

あなたはWindows形式に適応する必要があります。

+0

それも完璧に動作しますありがとうございました。 – Eduardo

1

私は自分自身が嫌いなので、私は自分自身に挑戦することを決めました。それは完全に可能判明:

$ cat /tmp/test.sed 
h 
:first 
n 
s/^\s*$/&/ 
t last 
H 
s/^// 
t first 
:last 
x 
:loop 
s/^(.*)(Every.*)(\1[^\n]*)$/\1\2\3/ 
t break 
s/(.*)(Every[^\n]*)((\n\1[^\n]*)*)\n\s*/\1\2\3\n\1/ 
t loop 
:break 
p 
g 
p 

、それは間違いなく、その結果実現:

h # overwrite hold buffer with current line 
:first # set a label 
n # overwrite current line(pattern buffer) with next line 
s/^\s*$/&/ # are we currently in blank line? 
t last # if so, we jump to :last, continue otherwise 
H # we append current line to hold buffer 
s/^// # always true 
t first # so we will be going back to :first 
:last 
x # so now we have all lines related to the single file. then we xchange the hold buffer to pattern buffer 
:loop # we need to loop to loop through all lines 
s/^(.*)(Every.*)(\1[^\n]*)$/\1\2\3/ # have we substituted all lines yet? 
t break # if so, we break the loop, continue otherwise 
s/(.*)(Every[^\n]*)((\n\1[^\n]*)*)\n\s*/\1\2\3\n\1/ # then we make sure each iteration will replace leading blanks with file path 
t loop # go back to the beginning of the loop 
:break 
p # we print all we have now substituted 
g # get back the blank line 
p # print the blank line 

このコードは、自動的に適応し、任意の行このような性質:私の不可解なソリューションの

$ sed -n -r -f /tmp/test.sed /tmp/try 
    C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

説明は以下の行くを空白行で区切られていれば、そのような形式のものであってもよい。あまりにも悪くないですね。あなたがしたい場合は、それを改善するために私を助けてください。

+0

ありがとう、それは現在のディレクトリで動作しますが、私はこのファイル内に3つのスラッシュの同じパターンに従わない多くのフォルダを持っているのでしょうか? 2行目のテキストが現れるまで、上の行から空白を含む行に同じ文字をコピーすることは可能でしょうか?たとえば : \t \t C:新規フォルダBUILTIN \管理者\ \ tempに:(I)(F) \t \t BUILTIN \管理者:(I)(OI)(CI)(IO)(F) \t \t NT AUTHORITY \ SYSTEM:(I)(F) – Eduardo

+0

@Eduardo私が言ったように、このコードは、各ファイルが空白行で区切られている限り、この形式を採用しています。パスに3つのスラッシュが含まれているとは限りません。 – HuStmpHrrr

+0

これは何らかの理由でこの質問のテキストが含まれているファイルで動作するのが奇妙ですが、C:\ newフォルダやC:\ temp \ newフォルダのようなフォルダがあれば空白が残ります。 – Eduardo

0

また、次のように、期待される出力に示されているように、最初は空白で区切ってください。

awk '{/C:/? s=$1 : NF ? $0 = s OFS $0 : ""; $1= " "$1 }1' infile 

試験結果:

$ cat infile 
    C:\temp\2\ok Everyone:(I)(RX) 
       BUILTIN\Administrators:(I)(F) 
       NT AUTHORITY\SYSTEM:(I)(F) 
       BUILTIN\Users:(I)(RX) 
       NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
        BUILTIN\Administrators:(I)(F) 
        NT AUTHORITY\SYSTEM:(I)(F) 
        BUILTIN\Users:(I)(RX) 
        NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

出力:

$ awk '{/C:/? s=$1 : NF ? $0 = s OFS $0 : ""; $1= " "$1 }1' infile 
    C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
    C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
    C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
    C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 
+0

ありがとう、 ファイル/フォルダが空白(例:C:\ New Folder \ subfolder \ New text file.txt)の場合にも動作させることは可能でしょうか? – Eduardo

0

のは

awk '{ 
if(/^C:\\temp/) {x=$1;print} 
else if(/[:alpha]/) {gsub(/^[ \t]+/," "); print x $0} 
else print;  
}' ipfile 
関連する問題