Shell 提取字符串中数字前的文本
Shell Extract Text Before Digits in a String
我找到了几个提取单个字符前的例子和提取数字的例子,但是我没有找到任何关于提取数字前字符的例子。
我的问题:
我的一些字符串如下所示:
NUC320 Syllabus Template - 8wk
SLA School Template - UL
CJ101 Syllabus Template - 8wk
TECH201 Syllabus Template - 8wk
Test Clone ID17
如果字符串不包含我想要的数据,我需要跳过它。所需的输出将是:
NUC-320
CJ-101
TECH-201
SLA School Template - UL
& Test Clone ID17
将被跳过。
我想象这个过程的效果是:
- 提取
" "
之前的文字
- 条件 - 检查字符串中的数字
- 提取数字前的文本并将其分配给变量
x
- 提取数字并分配给变量
y
- 连接
$x"-"$y
并分配给另一个变量 z
更多信息:
这些字符串是使用循环从几千个文本文档中的一行中提取的。它们将用于附加到超链接并在循环期间重命名文件。
编辑:
#!/bin/sh
# my files are named 1.txt through 9999.txt i both
# increments the loop and sets the filename to be searched
i=1
while [ $i -lt 10000 ]
do
x=$(head -n 31 $i.txt | tail -1 | cut -c 7-)
if [ ! -z "$x" -a "$x" != " " ]; then
# I'd like to insert the hyperlink with the output on the
# same line (1.txt;cj101 Syllabus Template - 8wk;www.link.com/cj101)
echo "$i.txt;$x" >> syllabus.txt
# else
# rm $i.txt
fi
i=`expr $i + 1`
sleep .1
done
符合POSIX的awk
解决方案:
awk '{ if (match(, /[0-9]+$/)) print substr(, 1, RSTART-1) "-" substr(, RSTART) }' \
file |
while IFS= read -r token; do
# Process token here (append to hyperlink, ...)
echo "[$token]"
done
awk
用于提取感兴趣的重新格式化的标记,然后在 shell while loop
.[=29 中进行处理=]
match(, /[0-9]+$/)
将第一个以空格分隔的字段 (</code>) 与扩展正则表达式 <code>[0-9]+$
匹配,即仅当字段以一个或多个数字结尾时才匹配。
substr(, 1, RSTART-1) "-" substr(, RSTART)
使用 -
将第一个数字之前的部分与 运行 数字连接起来,通过特殊的 RSTART
变量,表示从 1 开始的字符最近 match()
调用匹配的位置。
sed 用于打印以大写字母开头后跟数字的行。它还在它们之间添加了一个-
:
sed -n 's/^\([A-Z]\+\)\([0-9]\+\) .*/-/p' input
给出:
NUC-320
CJ-101
TECH-201
awk ' ~/[0-9]/{sub(/...$/,"-&",);print }' file
NUC-320
CJ-101
TECH-201
我找到了几个提取单个字符前的例子和提取数字的例子,但是我没有找到任何关于提取数字前字符的例子。
我的问题: 我的一些字符串如下所示:
NUC320 Syllabus Template - 8wk
SLA School Template - UL
CJ101 Syllabus Template - 8wk
TECH201 Syllabus Template - 8wk
Test Clone ID17
如果字符串不包含我想要的数据,我需要跳过它。所需的输出将是:
NUC-320
CJ-101
TECH-201
SLA School Template - UL
& Test Clone ID17
将被跳过。
我想象这个过程的效果是:
- 提取
" "
之前的文字
- 条件 - 检查字符串中的数字
- 提取数字前的文本并将其分配给变量
x
- 提取数字并分配给变量
y
- 连接
$x"-"$y
并分配给另一个变量z
更多信息: 这些字符串是使用循环从几千个文本文档中的一行中提取的。它们将用于附加到超链接并在循环期间重命名文件。
编辑:
#!/bin/sh
# my files are named 1.txt through 9999.txt i both
# increments the loop and sets the filename to be searched
i=1
while [ $i -lt 10000 ]
do
x=$(head -n 31 $i.txt | tail -1 | cut -c 7-)
if [ ! -z "$x" -a "$x" != " " ]; then
# I'd like to insert the hyperlink with the output on the
# same line (1.txt;cj101 Syllabus Template - 8wk;www.link.com/cj101)
echo "$i.txt;$x" >> syllabus.txt
# else
# rm $i.txt
fi
i=`expr $i + 1`
sleep .1
done
符合POSIX的awk
解决方案:
awk '{ if (match(, /[0-9]+$/)) print substr(, 1, RSTART-1) "-" substr(, RSTART) }' \
file |
while IFS= read -r token; do
# Process token here (append to hyperlink, ...)
echo "[$token]"
done
awk
用于提取感兴趣的重新格式化的标记,然后在 shellwhile loop
.[=29 中进行处理=]match(, /[0-9]+$/)
将第一个以空格分隔的字段 (</code>) 与扩展正则表达式 <code>[0-9]+$
匹配,即仅当字段以一个或多个数字结尾时才匹配。substr(, 1, RSTART-1) "-" substr(, RSTART)
使用-
将第一个数字之前的部分与 运行 数字连接起来,通过特殊的RSTART
变量,表示从 1 开始的字符最近match()
调用匹配的位置。
sed 用于打印以大写字母开头后跟数字的行。它还在它们之间添加了一个-
:
sed -n 's/^\([A-Z]\+\)\([0-9]\+\) .*/-/p' input
给出:
NUC-320
CJ-101
TECH-201
awk ' ~/[0-9]/{sub(/...$/,"-&",);print }' file
NUC-320
CJ-101
TECH-201