我需要通过bash在字符串中发现模式,我想用crontab自动执行。
我有一个包含数据的字符串
180MHz
等等。这是一份报告。
我想将字符串掩码定义为常量,并将每个子字符串与我的掩码进行比较。我想我会使用长度和焦点的混合物。
我正在谷歌搜索更好的想法并观看其他一些实现,但我找不到有用的结果。
有什么建议吗? 感谢。
编辑: 一些输入样本
%d/%m/%Y %H:%i aaa bbb ccc 123456 ddd 7890 eee
而作为输出我需要
01/01/2015 06:20 EXAMPLE 2 (001) Foo bar X(12)
02/01/2015 12:03 EXAMPLE 1 (000) 01234567 Baz bax X(04)
03/01/2015 10:37 EXAMPLE 1 (000) Bam bac (X:1-16). [ SOMEGUY ]
04/01/2015 11:04 EXAMPLE 2 (001) 12345678 Baz bax X(12) SOMEACTION
05/01/2015 12:34 EXAMPLE 2 (001) 45678901 Bim bum X(01) SOMEACTION NAME SURNAME
08/08/2015 19:00 SOMEGUY Bic bac. [ SOMEGUY ]
01/01/2015 11:34 EXAMPLE 2 (001) 78901234 Gic gia gim X(01)
Edit2:我忘了说我用这个
循环这些行variabile $date $time $example $codeline $action $message $name $surname
答案 0 :(得分:1)
使用typedef struct TEST{
int testInt[5];
};
TEST* myVarTest = new TEST();
格式化字符串:
date
如果这就是你的意思。
或者使用$ date +"%d/%m/%Y %H:%m aaa bbb ccc 123456 ddd 7890 eee"
09/10/2015 14:10 aaa bbb ccc 123456 ddd 7890 eee
,例如:
printf
或创建等效的printf "%s/%s/%s %s:%s aa bb cc" 2015 01 01 00 00
函数:
sprintf
如果您想以其他方式阅读,请使用sprintf() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }
,例如:
read
答案 1 :(得分:1)
可能是一个比你需要的更复杂的aplroach。但是你会以同样的方式......所以:
您是否听说过用于识别图像的机器学习技术?他们实际上使用了许多不同的面具(在你的情况下是一个字符串面具),你需要随机选择,然后在分析时纠正stocasticaly。将带有字符串和sum字符值的掩码与XOR进行异或。您将获得每个掩码的编号,并且您将实际生成一个哈希,告诉您字符串与掩码的匹配。比较类似的哈希值(int数字彼此接近),这些将是类似的字符串。
这是一个提示。您可以更容易或更深入,取决于您的要求。
答案 2 :(得分:0)
最后我用perl和regex解决了,我已经定义了我的字符串掩码$ FOO $ BAR $ BAZ,然后我将输入字符串与它们进行了比较
if ($myinputstring =~ $FOO) {
statement
} elseif($myinputstring =~ $BAR) {
otherstatment
} elseif ($myinputstring =~ $BAZ) {
someotherstatement
} else {
print_to_unmatched_log
}
由于
答案 3 :(得分:0)
最后我简化了我的问题,我收回了bash解决方案。 这是一个快速伪,告诉我你在想什么。
pre:
myregex1="^[0-9]{2}/[0-9]{2}/[0-9]{4}[[:space:]][0-9]{2}:[0-9]{2}$"
myregex2="^[[:space:]]\([0-9]{3}\)$"
myregex3="^[[:space:]][0-9]{8}$"
myregex4="^foo[[:space:]]bar$"
myregex5="^[[:space:]]baz\([0-9]{3}\)$"
...
nospace() { printf "$1" | sed -e 's/^[[:space:]]*//'; }
the code:
while loop each line of my source text file; do
buffer="";i=0
while IFS= read -r -N 1 char; do
buffer+="$char"; let "i++"
if [[ $buffer =~ $myregex1 ]]; then printf -v myvar1 "$(nospace "$buffer")"; i=$(( $i - ${#buffer} )); buffer="${buffer::-$i}"
elif [[ $buffer =~ $myregex2 ]]; then printf -v myvar2 SAME_STATEMENT_BEFORE
elif SAME_STATEMENT_BEOFRE_WITH_MYVAR3
elif ...
fi
done <<< "$mylinegotfromtextfile"
done < $mytextfile
就是这样,你知道更好的解决方案吗?