2017-04-02 100 views
-2

我一直在學習關於sed並發現它非常有用,但無法在許多指南和示例中找到答案...我想插入文件名一個文本文件,將其路徑和擴展名減去文本本身內的特定行。可能?用sed將文件名插入文本文件

+0

我建議提供有關環境的更多信息。我通過shell變量替換預測解決方案建議。所以請說明你正在使用的外殼類型。其他信息也許可以幫助,也許諮詢(http://stackoverflow.com/help/mcve)。 – Yunnosch

+0

是的,對不起。 Linux Ubuntu 16.04.2和GNU sed 4.2.2 – raysa

回答

1

在這種情況下,正確的起點應該是手冊頁。 sed手冊沒有提供sed功能來理解「文件名」,但sed確實支持在一行之前/之後插入文本。

因此,您需要單獨隔離文件名,將文本存儲到一個變量並在您希望的行之前/之前插入此文本。

實施例:

$ a="/home/gv/Desktop/PythonTests/cpu.sh" 
$ a="${a##*/}";echo "$a" 
cpu.sh 
$ a="${a%.*}"; echo "$a" 
cpu 

$ cat file1 
LOCATION 0 X 0 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a $a" file1 # Inject the contents of variable $a after line2 
LOCATION 0 X 0 
VALUE 1a 2 3 
cpu 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2i $a" file1 # Inject the contetns of variable $a before line2 
LOCATION 0 X 0 
cpu 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a George" file1 #Inject a fixed string "George" after line 2 
LOCATION 0 X 0 
VALUE 1a 2 3 
George 
VALUE 1b 2 3 
VALUE 1c 2 3 

說明:
a="${a##*/}":移除從字符串的開頭的所有字符最多持續發現斜線/(更長的匹配)
a="${a%.*}":刪除的結束開始的所有字符串到第一個找到的點。 (短賽)。您也可以使用%%找到最長的點。
sed "2a $a":2號線變量的內容後插入美元
sed "2i $q":插入線2之前的$一個

可選擇使用sed -i使下過程就地/修改文件內容

1

I've been learning about sed那麼你可能一直在浪費你的時間,因爲沒有太多的東西要學習關於sed超越s/old/new。當然,還有很多其他的語言結構和你可以用sed做的事情,但實際上你應該避免使用它們,而只是簡單地使用awk。如果您編輯問題以包含簡潔,可測試的示例輸入和預期輸出並添加awk標籤,那麼我們可以向您展示如何以正確的方式執行任何操作。

同時,這聽起來像你需要的是:打開的文件的第3行前

$ cat /usr/tmp/file 
a 
b 
c 
d 
e 

$ awk 'NR==3{print gensub(/.*\//,"",1,FILENAME)} 1' /usr/tmp/file 
a 
b 
file 
c 
d 
e 

上面插入當前文件的名稱。它使用GNU awk for gensub(),其他awk只使用sub()和變量。

+0

好點,但你錯過了刪除文件擴展名(後綴)。 – mklement0

+0

我們將看到OP提供什麼樣的輸入/輸出... –

+1

現在是任何一天。 :) – mklement0