我正在嘗試使用 sed 從提供的行號中洗掉檔案的內容。問題是 sed 不接受我提供給它的變數
line_num=$(grep -n "debited" file.csv | sed -n '2 s/:.*//p') && sed -i.bak "$line_num,$d" file.csv
這個想法是在 & 包括模式的第二次出現之后從檔案中洗掉所有行。
我不固執sed。Awk&perl也可以。
uj5u.com熱心網友回復:
似乎您想在第二次顯示模式 ( debited)后洗掉檔案的其余部分,包括該行。
然后可以截斷它,告訴該行讀取的內容的長度
perl -e'while (<>) {
if ( ($cnt = /debited/) == 2 ) { truncate $ARGV, $len; exit }
$len = tell;
}' file
這里$ARGV 變數具有“當前”檔案(從<>讀取時)。debited根據您的背景關系,隨意使用模式而不是文字 ( )引入變數。
這可以在一個小腳本中看起來更好,但似乎問題中需要一個命令列程式(“one-liner”)。
uj5u.com熱心網友回復:
我總是建議ed為編輯在嘗試使用iting檔案sed做到這一點; 從一開始就打算使用檔案而不是行流的程式對大多數任務效果更好。
這個想法是從檔案中洗掉所有行,包括模式的第二次出現[原文如此]
例子:
$ cat demo.txt
a
b
c
debited 12
d
e
debited 14
f
g
h
$ printf "%s\n" '/debited/;//,$d' w | ed -s demo.txt
$ cat demo.txt
a
b
c
debited 12
d
e
該ed命令/pattern/;//,$d首先將當前行游標設定為與基本正則運算式模式匹配的第一個游標,然后將其移動到模式的下一個匹配項并洗掉從那里到檔案末尾的所有內容。然后w將更改后的檔案寫回磁盤。
uj5u.com熱心網友回復:
你正在做很多不必要的步驟,這會做你想做的。
$ awk '/debited/{c } c==2{exit}1' file
洗掉第二次出現的模式及其后的所有內容。
替換原始檔案(并創建備份)
$ awk ... file > t && mv -b --suffix=.bak t file
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399097.html
下一篇:為什么在perl中00等于0?
