首頁>Linux>source

我正在尝試使用一个sed指令碼来进行更改並輸出一个新檔案,但是它必须在頂部添加两个註釋行,以便隨後可以將自己作為bash指令碼執行輸出檔案.麻煩的是,我看到的所有用於添加两个頂行的解決方案都不適用於註釋,這会使指令碼本身無法正常工作。

例如,如果我的sed結果是這樣的檔案:

AAAA
BBBB
CCCC
DDDD

我最终要得到這樣的东西:

#$ -cwd
#$ -pe mpi 16
AAAA
BBBB
CCCC
DDDD

我已经尝試過類似這樣的事情:

sed -i '1s/^/#$ -cwd\n/' output.txt

但是這些会將#號之後的所有內容都视為註釋。

我如何編寫一个bash指令碼来添加註釋標頭而不弄亂自己? 谢谢!

最新回復
  • 6月前
    1 #

    為避免使用引號等特殊字元来与 sed一起使用而引起的所有問题 ,請使用帶引號的此處文件:

    cat - output.txt <<'END_COMMENTS' >newfile.txt
    #$ -cwd
    #$ -pe mpi 16
    END_COMMENTS
    

    這会將您的三行多餘文字与現有檔案 output.txt的內容連線在一起 ,並將結果文字放入 newfile.txt .然後,您可以重命名 newfile.txt 进入 output.txt 如果需要的话。

    cat 该命令在此處帶有两个引數:

    - ; 這指示 cat 首先从標準輸入中讀取.標準輸入流將包含包含您的標题文字的此處文件。

    output.txt ; 這是您現有的檔案.只要讀取了標準輸入上到達的資料,就会讀取该資料。

    測試:

    $ cat output.txt
    AAAA
    BBBB
    CCCC
    DDDD
    

    > 以下各行開頭的提示是 bash的輔助提示 shell,当需要更多輸入来完成命令時使用。

    $ cat - output.txt <<'END_COMMENTS' >newfile.txt
    > #$ -cwd
    > #$ -pe mpi 16
    >
    > END_COMMENTS
    
    $ cat newfile.txt
    #$ -cwd
    #$ -pe mpi 16
    AAAA
    BBBB
    CCCC
    DDDD
    

    請註意,如果最终輸出應该是 bash shell指令碼,那麼標题的第一行應為 #! 行与 bash的绝對路徑名 解釋器。


    您也可以只使用 printf

    printf '%s\n' '#$ -cwd' '#$ -pe mpi 16' '' |
    cat - output.txt >newfile.txt
    

    它使用 printf而不是here-document 生成三行標题文字.結果將是相同的,但是看起来很丑陋,您需要了解代碼才能看到標题文字的實際外观(顯然,除非您執行它)。

  • 6月前
    2 #

    Kusalananda的答案可能是最好的 解決方案,因為它將始终有效,但是我也已经驗證了使用仅sed解決方案也是可行的:

    $ cat output.txt 
    AAAA
    BBBB
    CCCC
    DDDD
    $ sed '1i#$ -cwd\n#$ -pe mpi 16\n' output.txt 
    #$ -cwd
    #$ -pe mpi 16
    AAAA
    BBBB
    CCCC
    DDDD
    

    基本上使用sed的(i)nsert命令代替(s)ubstitute:
    1 -在1號線操作
    i -在
    之前插入 1i -在第1行之前插入

    這在gnu sed 4.8上有效. yMMV

  • kernel:找出我的充電適配器有多少電?
  • CUPS無驅動程式print服務器,作為具有旧版PPDprint機驅動程式的print機的代理