2016-02-04 38 views
1

從文本文件中刪除值我試圖使用一系列命令(使用終端)從文本文件中刪除ID號,但它們似乎不工作。我需要刪除的數量和相關的「ID」文本無法使用-sed

文本文件中: {「ID」:「098765432」}

我一直在使用(但不要顯得命令奏效):

sed -i.bak 's/"id":[0-9]\{1,\},//g' ./Filename.txt 
sed -i.bak 's/"id":"[0-9]\{1,\}",//g' ./Filename.txt 
sed -i.bak 's/"id":"[0-9]\{9,\}",//g' ./Filename.txt 
sed -i.bak 's/"id":[0-9]\{9,\},//g' ./Filename.txt 
sed -i.bak 's/"[0-9]\{1,\}",//g' ./Filename.txt 

感謝您的幫助:)

+0

你是否想用sed來操縱json?你能顯示輸入文件和你的預期輸出嗎? – hek2mgl

+1

如果這是JSON,請查看[jq](https://stedolan.github.io/jq/)。你可以使用'jq'del(.id)'filename'。 – Wintermute

+0

@ hek2mgl不,我試圖操縱一個文本文件。一個簡單的.txt文件 – Andrew

回答

1

由於@Wintermute的評論已經指出,這個問題是在之前//逗號。但是,我將解釋整個系列,以便其他人可以完全理解它,以防晚些時候遇到此問題的人不清楚。

所以,正確的命令,將滿足您的要求是:

sed -i.bak 's/"id":"[0-9]\{1,\}"//g' ./Filename.txt 

sed的是調用stream editor命令。

標記-i是用於表示編輯文件的標誌(它使得備份具有擴展功能)。在這種情況下,寫入的擴展名是.bak,事實上備份文件(包含我們文件的初始上下文)是使用原始名稱+所提供的擴展名創建的。

參數's /「id」:「[0-9] {1,}」// g'是給sed命令的參數。

由於該論點(regular expression)是問題的原因,我將詳細解釋它。

我們應該注意第一部分是它的結構是S /正則表達式/更換/克其中

的Regex = 「ID」: 「[0-9] {1,}」

代用如Bruce Barnett描述=無(字面上沒有,甚至沒有空格)

因此,基本上,小號代表取代。 正則表達式是我們將用替代替換的部分。最後,信件g意味着我們將改變每行一次以上的正則表達式(不含g,它將僅替換每行中的第一次出現,不管有多少次)。

和結束時,我們有./Filename.txt,這是我們正在應用此命令的源文件(./意味着該文件是在相同的目錄從那裏我們正在運行此命令)。

關於使用正則表達式( 「ID」: 「[0-9] {1,}」):

它開始與文字( 「ID」:「),並且該部分將接下來,我們有([0-9] {1,}),這意味着除了第一部分之外,我們還希望找到at最少出現一次數字(但它可以是更多的,如問題的匹配示例所示)

現在你可以理解爲什麼逗號導致了這個問題,原始文本中沒有逗號。因此,沒有任何通訊並試圖(因爲它們都包含逗號),沒有工作。當然,其中一些還有更多的理由。

編輯:正如@ghoti指出的,替換是不是一個正則表達式。這是我們將放在我們的正則表達式找到的地方的字符串。所以在這種情況下,我們的替換是空白字符串(因爲我們要刪除指定的部分)。

+2

你對's/Regex1/Regex2/g'的解釋不正確。在sed替換中,符號是's/regex/replacement /'。替換字符串是*不是正則表達式,它只是文本,可能帶有表示與第一部分中的正則表達式匹配的「已翻譯」位。例如,'s/e \([aeiou] \)/ E \ 1 /'將大寫一個元音前面的「e」,但沒有其他的「e」。 – ghoti

+0

@ghoti你完全正確。我編輯了我的答案。 :) –