我有一长串以冒号分隔的Unicode值列表。这是一个例子:
E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
我所需要的只是“E0027;”一部分。
所以我首先需要在第一个分号之后删除所有内容,但在某些情况下,分号是在4位之后,在其他情况下,(如上所述)它在5之后。如果它在整个I'd中都是相同的只需在固定数量的字符后截断。我已经找到很多用awk进行各种操作的例子,但没有正则表达式似乎适合这种特殊情况。有谁知道正确的语法是什么?逻辑只是将所有内容保留在第一个分号之前并删除它之后的所有内容。
然后,对于生成的文件,如果数字只有4个字符,我需要在该行中添加前导0。例如:
8A9B;
应该成为:
08A9B;
但是5位数值(例如第一个例子)应保持原样......没有前导零。
(如果我在HTML中使用这些值,那么额外的前导零是否会有所不同?如果我有这个值,那会不会很重要:
󠀧
而不是:
󠀧
如果这些将被PHP完全相同地解析并且不会产生影响,我猜后一部分并不是那么重要(尽管有数千个额外的零,它会膨胀代码的大小。)
提前感谢您的帮助!
答案 0 :(得分:2)
awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'
$ echo "8A9B;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'
08A9B;
$ echo "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'
E0027;
答案 1 :(得分:0)
我不是* nix man,所以不熟悉awk。但是,如果php解决方案可以接受,那么:
$values = array();
$lines = file( '/path/to/file', FILE_SKIP_EMPTY_LINES );
foreach( $lines as $line )
{
// get part before first occurence of ;
$value = strstr( $line, ';', true );
// pad the value, if applicable
$value = str_pad( $value, 5, '0', STR_PAD_LEFT );
// put it in the result array
$values[] = $value;
}
如果一次将整个文件读入内存是不可接受的,您可以逐行阅读,当然是fopen()
,fgets()
等。
答案 2 :(得分:0)
编辑:awk代码修复为留下最后';'到位。
print -- "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" \
| awk '{
#dbg print "$0=" $0
sub(/;.*$/, ";") # fixed here
len=length($0)
if (len == 5) {print "0" $0} # this was 4, now 5 with ';'
else if (len == 6) {print $0} # 5 changed to 6
else {print "error in input: found len=" len " in XX" $0 "xx"}
}'
您可以将print -- "... " |
替换为cat file |
或者取消UUOC奖励并删除print -- "..." |
并在awk程序的最后inFileName > outFileName
之后追加'
。
我不知道你的HTML问题的答案。
我希望这会有所帮助。
P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,或者给它一个+(或 - )作为有用的答案
答案 3 :(得分:0)
$ echo "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F";" '{ printf "%05s\n",$1 }'
E0027
答案 4 :(得分:0)
BEGIN {FS="\;"}
{print substr("0000" $1 FS, length($1),6)}
输入:
E0027; TAG APOSTROPHE; Cf; 0; BN ;;;;; N ;;;;;
8A9B; TAG APOSTROPHE; Cf; 0; BN ;;;;; N ;;;;;
输出:
E0027;
08A9B;
在ideone运行。