的組合來分隔:LIST.TXT包含真難看的數據,像這樣:如何。如果文件分割字符串或文件可以通過評論和空格,製表符,換行符,逗號或其他字符
aaaa
#bbbb
cccc, dddd; eeee
ffff;
#gggg hhhh
iiii
jjjj,kkkk ;llll;mmmm
nnnn
我們如何使用bash腳本解析/拆分該文件,不包括註釋行,用所有逗號,分號和所有空格(包括製表符,空格和換行符以及carrage-return字符)對它們進行分隔?
的組合來分隔:LIST.TXT包含真難看的數據,像這樣:如何。如果文件分割字符串或文件可以通過評論和空格,製表符,換行符,逗號或其他字符
aaaa
#bbbb
cccc, dddd; eeee
ffff;
#gggg hhhh
iiii
jjjj,kkkk ;llll;mmmm
nnnn
我們如何使用bash腳本解析/拆分該文件,不包括註釋行,用所有逗號,分號和所有空格(包括製表符,空格和換行符以及carrage-return字符)對它們進行分隔?
使用shell命令:
grep -v "^[ |\t]*#" file|tr ";," "\n"|awk '$1=$1'
,可以用下面的代碼來完成:
#!/bin/bash
### read file:
file="list.txt"
IFSO=$IFS
IFS=$'\r\n'
while read line; do
### skip lines that begin with a "#" or "<whitespace>#"
match_pattern="^\s*#"
if [[ "$line" =~ $match_pattern ]];
then
continue
fi
### replace semicolons and commas with a space everywhere...
temp_line=(${line//[;|,]/ })
### splitting the line at whitespaces requires IFS to be set back to default
### and then back before we get to the next line.
IFS=$IFSO
split_line_arr=($temp_line)
IFS=$'\r\n'
### push each word in the split_line_arr onto the final array
for word in ${split_line_arr[*]}; do
array+=(${word})
done
done < $file
echo "Array items:"
for item in ${array[*]} ; do
printf " %s\n" $item
done
這是不是提出一個問題,而是一個更好的解決方案已回答其它相關問題時,在感動別人。這裏獨一無二的是,那些其他問題/解決方案並沒有真正解決如何在用空格,字符和註釋組合分隔字符串時如何分割字符串;這是一個解決方案,滿足所有三個同時...
相關問題:
How to split one string into multiple strings separated by at least one space in bash shell?
How do I split a string on a delimiter in Bash?
其他注意事項:
爲什麼這樣做在bash當其他腳本語言更適合分裂?與perl程序相比,bash腳本更可能擁有從基本的新貴或cron(sh)shell運行時所需的所有庫。在這些情況下經常需要一個參數列表,我們應該期望那些維護這些列表的人最糟糕......
希望這篇文章可以節省bash新手很多時間在未來(包括我)...好運氣!
,如果你有紅寶石您的系統上
File.open("file").each_line do |line|
next if line[/^\s*#/]
puts line.split(/\s+|[;,]/).reject{|c|c.empty?}
end
輸出
# ruby test.rb
aaaa
cccc
dddd
eeee
ffff
iiii
jjjj
kkkk
llll
mmmm
nnnn
sed 's/[# \t,]/REPLACEMENT/g' input.txt
上面的命令替換註釋字符('#'
),空間(' '
),標籤('\t'
)和逗號(','
)與任意字符串('REPLACEMENT'
)
替換換行符,你可以嘗試:
sed 's/[# \t,]/replacement/g' input.txt | tr '\n' 'REPLACEMENT'
這並不真正忽視評論。它只是使用「#」字符作爲分隔符... –
如果您想忽略註釋,請嘗試'$ YOUR-CMD-HERE | grep -v'^#''。這會忽略以'#'開頭的行 – csiu
您能否讓您的答案更具描述性?例如,解釋它爲什麼有效,每個參數等代表什麼。這將使您的答案對未來的讀者更有價值,並幫助教授OP。 –
我不確定你有什麼問題,grep,tr,awk都是流行的shell命令,我不是在這裏教一些東西。人們可以在谷歌搜索大量樣本,以瞭解這些命令,如果他們想學習。爲什麼我們需要把他們當成嬰兒? – BMW
這是一個很好的竅門,除了我會這樣寫它以獲得它到一個可用的數組:array = \'grep -v「[^ | \ t] *#」list.txt | tr「;,」「\ n「| awk'$ 1 = $ 1''現在我將嘗試解釋它是如何工作的:grep命令返回所有不符合空格的註釋模式的行,從而導致#char。 tr命令然後交換「;」的所有實例或「,」換成新的。 awk命令是一個漂亮的技巧,可以從行中刪除前導和尾隨空白。因此,你留下了所需的數據... –