2015-11-06 16 views
0
#!/bin/bash 
read k 
read m 
read fileName 
head -n -$k $fileName | tail -n +$m $fileName 

嗨,這是我現在擁有的。我必須創建bash解釋器來刪除頭部的行,並從文本文件中刪除尾部的行。我不得不通過這種方式來執行這個bash解釋器。 ./strip.sh 2 3 hi.txt> bye.txtBash Interpreter read

如何讀取2代表k和3代表m? 另外我如何閱讀fileName的hi.txt文件? 也是我的代碼正確嗎? 請回答這些問題。我對這個bash解釋器真的很陌生。 謝謝。

回答

1

read用於讀取標準輸入值。你想要什麼位置參數:

k=$1 
m=$2 
fileName=$3 
head -n -$k "$fileName" | tail -n +$m 

tail下降fileName最後一個參數,因爲它會從標準輸入(通過head標準輸出饋電)讀,而不是命名的文件。

+0

您好,謝謝你這麼多!! –

+0

我有另外一個問題,當我執行它時,它有時只刪除它應該刪除的內容,比如./strip.sh 4 5 hi.txt> bye.txt應該刪除前4行和後5行,但它只刪除前4行和最後一個「4」行。此外,當我EXCUTE ./strip.sh 11個hi.txt> bye.txt,它只是刪除最後一行,而不是第一行.... –

+1

請不要在com中提出其他問題部分。 – chepner

0

@chepner指出你在正確的方向,但目前的腳本不能像你期望的那樣工作。如果您想嘗試另一種方法:

#!/bin/bash 
set -u 

k=${1} 
file=${3} 
lines=$(wc -l < "${file}") 
m=$[${lines}-${2}] 

awk 'NR>'${k}' && NR<='${m} "${file}" 

其中:

  • set -u:讓未定義的變量(如缺少PARAMS)停止執行
  • $(wc -l < "${file}"):算上文件的總線條。
  • $[${lines}-${2}]:從底部行中減去所需的(通過從線
  • 的總數去除
  • awk 'NR>k && NR<=m':打印(默認AWK行爲)的線> k和< =米
+0

讀取文件兩次以獲取其長度是一個反模式。這有時是有用的,但這不是其中之一。 – tripleee

+0

@tripleee:你說得對一般但*刪除最近x線*,如果一個通用的工具處理文件**一行行**怎麼能知道什麼時候停止?它只在實際到達結束時才知道EOF。所以,你需要的可能編程它從最終回到X線(這是可能的SED或AWK複雜腳本),或者你必須知道* *前開始在哪一行,你必須停下來。 –