更新:根據你以後的意見,使用sed
提取的每次迭代感興趣的行下面的地道猛砸代碼解決您的問題更加簡單:
注:
- 如果輸入文件在循環迭代之間不會改變,並且輸入文件足夠小(因爲它就在眼前),所以將文件內容緩存到變量中會更有效,如下面原始答案中所示。
- 作爲tripleee在註釋中指出:如果簡單地讀取所述輸入線依次足夠(如由特定行號,反對引出配線然後一個單一的,簡單while read -r line; do ... # fold and output, then sleep ... done < "$filename"
足夠
# Determine the input filename.
filename='slash'
# Count its number of lines.
lineCount=$(wc -l < "$filename")
# Loop over the line numbers of the file.
for ((lineNum = 1; lineNum <= lineCount; ++lineNum)); do
# Use `sed` to extract the line with the line number at hand,
# reformat it, and output to the target file.
fold -w 21 -s <(sed -n "$lineNum {p;q;}" "$filename") > 'news1'
sleep 5
done
。
什麼,我想你正在努力實現的簡化版本:
#!/bin/bash
# Split fields by newlines on input,
# and separate array items by newlines on output.
IFS=$'\n'
# Read all input lines up front, into array ${lines[@]}
# In terms of your code, you'd use
# read -d '' -ra lines < "$filename"
read -d '' -ra lines <<<$'line 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\nline 11\nline 12\nline 13\nline 14\nline 15'
# Define the arrays specifying the line ranges to select.
firstline=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)
lastline=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
# Loop over the ranges and select a range of lines in each iteration.
for ((i=0; i<${#firstline[@]}; i++)); do
extractedLines="${lines[*]: ${firstline[i]}: 1 + ${lastline[i]} - ${firstline[i]}}"
# Process the extracted lines.
# In terms of your code, the `> slash1` and `fold ...` commands would go here.
echo "$extractedLines"
echo '------'
done
注:
填充read -ra
數組變量的名稱爲lines
; ${lines[@]}
是擊語法用於返回所有數組元素作爲單獨的字(${lines[*]}
也指所有的元件,但是具有略微不同的語義),並且該語法中的註釋用於示出lines
確實是一個陣列變量(注如果你簡單地使用$lines
引用變量,你含蓄與指數0
,這是一樣的只得到項目:${lines[0]}
<<<$'line 1\n...'
使用here-string(<<<
)來讀取AD- hoc 樣品文件(表示爲一個ANSI C-quoted string($'...'
))爲了使我的示例代碼自包含的興趣。
- 正如評論所說,你會從
$filename
,而不是閱讀:
read -d '' -ra lines <"$filename"
extractedLines="${lines[*]: ${firstline[i]}: 1 + ${lastline[i]} - ${firstline[i]}}"
提取感興趣的線路; ${firstline[i]}
引用來自數組${firstline[@]}
的當前元素(索引i
);因爲在bash的數組切片語法
(${lines[*]: <startIndex>: <elementCount>}
)的最後一個令牌是元素的計數返回,我們必須執行計算確定計數,這是什麼呢1 + ${lastline[i]} - ${firstline[i]}
。
- 藉助於使用
"${lines[*]...}"
而非"${lines[@]...}"
的,所提取的陣列元件由在$IFS
的第一個字符,這在我們的情況下是一個新行($'\n'
)(提取單個線時加入,即沒有按」真的很重要)。
一個側面說明,你可以取代'我= $(($ I + 1))'和'((我+ +))'。 – sjsam
事後看來,這是一個[XY問題](http://meta.stackexchange.com/a/66378/248777):使用外部實用程序通過單個循環更好地解決了問題,該循環通過行號 - 不需要_nested_循環。 – mklement0