[英]Using sed command search for a word and substitute the next word
我有一個大文件,其中包含單詞 TITLE 和附近的單詞 name 。 所以,例如:
cat file1 :
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('QA')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('QA')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('RN') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')
我正在嘗試將所有 TITLE(...) 替換為 TITLE('DEV') 。 所以,輸出應該是:
cat file1 :
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('DEV')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('DEV')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('DEV') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')
我只是用 sed 來 grep 標題和之后的所有內容:
sed 's/.*\(TITLE...\)/\1/' file1
不確定如何替換 TITLE 部分。 任何幫助表示贊賞,謝謝。
如果您的示例輸入文件代表所有可能的輸入,那么以下可能是您可以獲得的最短且仍然可讀的解決方案
sed "s/TITLE([^)]*)/TITLE('DEV')/" file1
對於給定的格式,這將執行以下操作:
sed -e "s#\(TITLE('\)[^']\+')#\1DEV')#" file1
實際上這可能更容易解析:
sed -e "s#\<TITLE('[^']\+')\>#TITLE('DEV')#" file1
並且我們並沒有真正為自己節省那么多使用反向引用的輸入。
您可以找到TITLE('<CHARS_NOT_APOSTROPHE>')
任何實例(我還添加了單詞邊緣以進行良好測量。)並將其替換為TITLE('DEV')
。
sed --expression="s/TITLE('[^']*')/TITLE('DEV')/" file1
如果您需要對上述 RegExp 的解釋,請告訴我。
樣本數據:
$ cat titles.dat
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('QA')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('QA')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('RN') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')
一種sed
解決方案:
$ sed "s/\(TITLE('\)[^']*\(')\)/\1DEV\2/g" titles.dat
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('DEV')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('DEV')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('DEV') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')
在哪里:
\\(TITLE('\\)
- 找到我們的第一個模式TITLE('
; 存儲為模式 #1[^']*
- 匹配模式 #1 之后的所有內容,只要不是單引號 (')\\(')\\)
- 找到我們的第二個模式')
; 存儲為模式 #2\\1DDEV\\2
- 輸出模式 #1 + 'DEV' + 模式 #2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.