Answers:
我会用sed
sed 's/^.*\(consectetuer.*elit\).*$/\1/' file
解码sed s / find / replace /语法:
s/^.*
-替换从行(^
)的开头开始,后跟任何(.*
)直到...\(
-启动一个命名块consectetuer.*elit\.
-匹配第一个单词,将所有(.*
)匹配到您要匹配的最后一个单词(在这种情况下,包括结尾的(转义的)点)\)
-结束命名块.*
)匹配到行($
)的末尾/
-结束替代查找部分\1
-替换为之间的名字块\(
和\)
上述/
-结束替换^
或,$
因为sed会尝试找到最长的匹配项。另外,您可能已经错过了。之后的点elit
,\.
如果需要可以插入。
^
,并$
没有必要-我把它们放在那里作为提问者注意(本来)说,他是一个有点初学者的,这可能是在其他情况下很有帮助。
AWK中有两个for循环:
$ awk '{for(i=1;i<=NF;i++) {if ($i == "consectetuer") beginning=i; if($i== "elit.") ending=i }; for (j=beginning;j<=ending;j++) printf $j" ";printf "\n" }' file.txt
consectetuer adipiscing elit.
AWK的gsub:
$ awk '{gsub(/^.*consectetuer/,"consectetuer"); gsub(/elit.*$/,"elit.");print}' file.txt
consectetuer adipiscing elit.
我不确定为什么这个问题标题已经被“ 从文件 ” 编辑为“ 从一行 ”,而OP并没有排除跨多行的可能性,即使该示例似乎只是一行。无论如何,在此处提供多行解决方案可能会有所帮助。
这适用于交叉线:
from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
例子:
[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl
home
def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl
home
def elit
[xiaobai@xiaobai tmp]$
参考:Shell参数扩展
sed
。它也可以是perl
,甚至是纯bash。