GVKun编程网logo

如何提取unix中两个单词之间的文本?(如何提取unix中两个单词之间的文本内容)

19

如果您对如何提取unix中两个单词之间的文本?和如何提取unix中两个单词之间的文本内容感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何提取unix中两个单词之间的文本?的各种细节,并对如何

如果您对如何提取unix中两个单词之间的文本?如何提取unix中两个单词之间的文本内容感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何提取unix中两个单词之间的文本?的各种细节,并对如何提取unix中两个单词之间的文本内容进行深入的分析,此外还有关于linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行、linux – 使用sed或awk重复提取两个字符串之间的文本?、Linux:在同一行上的特定单词之后提取一个单词、php – 解析2个单词之间的文本的实用技巧。

本文目录一览:

如何提取unix中两个单词之间的文本?(如何提取unix中两个单词之间的文本内容)

如何提取unix中两个单词之间的文本?(如何提取unix中两个单词之间的文本内容)

一世

上午

运用

基本

SED

expression: –

sed -n "am/,/sed/p"

得到“am”和“sed”之间的文本,它将输出“am n使用 n basic n sed”。 但我真正的问题是,如果string是:

一世

上午

运用

基本

grep的

expression。

我在这个句子中应用了上面的sed,然后它给出了“ n使用 n basic n grep nexpression式”,它不应该给它。 如果没有匹配,如何丢弃输出?

sed help:匹配和replace文字“ n”(不是换行符)

如何用Windows命令在文本文件中查找string并复制下5个字符

Windows脚本:列出不匹配模式的文件

如何select两种模式之间的线?

如何使用awk在文件中写入一个文件(); 并在之后添加一个printline; 打印find的string?

有什么build议么?

禁用sed中反斜杠的转义函数

查找和replace循环内部

如何在BYTE数组中search模式?

Sed未能取代UTF-8编码

unix:如何判断一个string是否匹配正则expression式

问题中的命令( sed -n "/am/,/sed/p" ,注意添加的斜杠)表示:

找到一个包含字符串am

并打印( p )直到包含sed的行发生

因此它打印:

I am using basic grep expression

因为它包含了am 。 如果要添加更多的行,它们也将被打印,直到包含sed的行出现。

例如:

echo -e 'I am using basic grep expression.nOne more linenOne with sednOne without' | sed -n "/am/,/sed/p"

结果是:

I am using basic grep expression. One more line One with sed

我想 – 你想要做的是这样的:

sed -n "s/.*(am.*sed).*/1/p"

例:

echo 'I am using basic grep expression.' | sed -n "s/.*(am.*sed).*/1/p" echo 'I am using basic sed expression.' | sed -n "s/.*(am.*sed).*/1/p" sed -n "s/.*(am.*sed).*/1/p"

你必须使用稍微不同的sed命令:

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/n/ /gp;}}' file

仅打印包含横跨多行的文本am和sed行。

使用SED时,这可以工作,但它是一个相当压倒性的语法…如果您需要裁剪多行( n)文本的一部分 ,您可能想要尝试一个更简单的方法使用grep

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

例如,我觉得这是抓取perforce变更列表描述 (没有CL信息的其余部分)的最简单的方法:

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

请注意,您可以使用<=和> =在输出中包含或不包含开始/结束短语。

linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行

linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行

我知道sed使用以下命令从test.txt打印单词FOO和BAR之间的行

sed -n '/FOO/,/BAR/p' test.txt

但是,只有当其中一条线具有匹配的图案时,我如何使sed打印FOO和BAR之间的线条

例如,文件text.txt包含以下行:

Error- Undefined port
line1
line2
Undefined port in ALU1 
line3

Error- Undefined port
line4
line5
Undefined port in LSU 
line6

Error- Undefined port
line7
line8
Undefined port in FGU 
line9 

Error- Undefined port
line10
line11
Undefined port in ALU2 
line12

我想在两次连续出现之间打印出行
 仅当其中一行包含单词“ALU”时,单词“Error”.

所以我只想打印出以下错误消息:

Error- Undefined port
line1
line2
Undefined port in ALU1 
line3

Error- Undefined port
line10
line11
Undefined port in ALU2 
line12

解决方法

要实现这一点,您需要在sed脚本中分支并保留缓冲区.

该脚本使用两个缓冲区:模式缓冲区(它是sed存储当前处理的行的缓冲区,用于模式匹配测试的缓冲区)和保持缓冲区(用于存储前一行的缓冲区).我们的想法是存储上一个/错误/模式匹配的所有行,并在下一个/错误/匹配或流结束时检查/ ALU /出现.

sed -n '
# if /Error/ pattern occured,jump to /ALU/ check
/Error/ b alu_check
# else append current line to the hold buffer
H
# if the current line is the last one,jump to /ALU/ check
$b alu_check
# otherwise jump to end of script (= finish processing of this line)
b
# alu_check:
:alu_check
# exchange current pattern buffer with hols buffer context
x
# print prevIoUs record if /ALU/ occured
/ALU/ p
'

x命令用保持缓冲区上下文(从上次记住的内容)交换模式缓冲区上下文(当前行) – 注意它将当前行/ Error / pattern存储到保持缓冲区以供下次使用

H将当前行上下文附加到保持缓冲区

linux – 使用sed或awk重复提取两个字符串之间的文本?

linux – 使用sed或awk重复提取两个字符串之间的文本?

参见英文答案 > How to use sed/grep to extract text between two words?11个
我有一个名为’plainlinks’的文件,如下所示:
13080. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94092-2012.gz
13081. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94094-2012.gz
13082. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94096-2012.gz
13083. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94097-2012.gz
13084. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94098-2012.gz
13085. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94644-2012.gz
13086. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94645-2012.gz
13087. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94995-2012.gz
13088. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94996-2012.gz
13089. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-96404-2012.gz

我需要生成如下所示的输出:

999999-94092
999999-94094
999999-94096
999999-94097
999999-94098
999999-94644
999999-94645
999999-94995
999999-94996
999999-96404

解决方法

使用sed:
sed -E 's/.*\/(.*)-.*/\1/' plainlinks

输出:

999999-94092
999999-94094
999999-94096
999999-94097
999999-94098
999999-94644
999999-94645
999999-94995
999999-94996
999999-96404

要将更改保存到文件,请使用-i选项:

sed -Ei 's/.*\/(.*)-.*/\1/' plainlinks

或者保存到新文件然后重定向:

sed -E 's/.*\/(.*)-.*/\1/' plainlinks > newfile.txt

说明:

s/    # subsitution
.*    # match anything
\/    # upto the last forward-slash (escaped to not confused a sed)
(.*)  # anything after the last forward-slash (captured in brackets)
-     # upto a hypen
.*    # anything else left on line
/     # end match; start replace 
\1    # the value captured in the first (only) set of brackets
/     # end

Linux:在同一行上的特定单词之后提取一个单词

Linux:在同一行上的特定单词之后提取一个单词

我是一个新的Linux用户,我是自学的,所以我很抱歉如果这个问题是愚蠢的。 我在网上search,但无法find一个正确的答案..我怎样才能提取一个字在Linux(csh)的特定单词后? 更确切地说,我有一个文件,其中有一行看起来像这样的文件:

[一些无用的数据] –pe_cnt 100 –rd_cnt 1000 [更多数据]

我想提取–pe_cnt字之后的数字100 。 我不能使用''sed'',因为只有当你想要提取整行时才有效。 也许我可以用''awk''?

此外,我有多个文件具有不同的值而不是100,所以我需要的东西,提取的价值,但不依赖于价值。

通过按下特定button来停止脚本(脚本正在处理时听STDIN)

Bashvariables冲突

string的Bash / Substring

用awk或sedreplace和增加字母和数字

如何从一个子函数返回导致返回到父函数?

xmlstarlet XPathexpression式select单个结果而不是多个

在Bash,如何排版一个variables(数字)为5digit?

如何在几秒钟内安排定时重启我的服务器?

MysqL:如何检查退出状态?

有效地超时一个命令,并捕获输出到bash脚本中的variables

用awk :

awk ''{for(i=1;i<=NF;i++) if ($i=="--pe_cnt") print $(i+1)}'' inputFile

基本上循环每行的单词。 当你找到第一个你正在寻找,抓住下一个字,并打印出来。

用grep :

grep -oP "(?<=--pe_cnt )[^ ]+" inputFile

你可以使用sed。 只需要一组想要匹配的组,并用整个组来替换全行:

sed -n ''s/^.*pe_cnts+([0-9]+).*$/1/p'' file

如果在--pe_cnt和100之间存在单个空格字符,则可以使用前瞻和后向断言

grep -oP ''(?<=--pe_cnts)d+(?=s+--rd_cnt)''

总结

以上是小编为你收集整理的Linux:在同一行上的特定单词之后提取一个单词全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

php – 解析2个单词之间的文本

php – 解析2个单词之间的文本

可以肯定的是,其他人已经问到了这个问题,不过我在这里搜索了SO并且没有找到任何内容

我有一个字符串,想要一个包含2个分隔符(2个单词)之间所有单词的数组.我对正则表达式没有信心所以我最终得到了这个解决方案,但它不合适,因为我需要得到符合这些要求的所有单词,而不仅仅是第一个.

$start_limiter = 'First';
$end_limiter = 'Second';
$haystack = $string;

# Step 1. Find the start limiter's position

$start_pos = strpos($haystack,$start_limiter);
if ($start_pos === FALSE)
{
    die("Starting limiter ".$start_limiter." not found in ".$haystack);
}

# Step 2. Find the ending limiters position, relative to the start position

$end_pos = strpos($haystack,$end_limiter,$start_pos);

if ($end_pos === FALSE)
{
    die("Ending limiter ".$end_limiter." not found in ".$haystack);
}

# Step 3. Extract the string between the starting position and ending position
# Our starting is the position of the start limiter. To find the string we must take
# the ending position of our end limiter and subtract that from the start limiter
$needle = substr($haystack, $start_pos+1, ($end_pos-1)-$start_pos);

echo "Found $needle";

我还想过使用explode(),但我认为正则表达式可以更好更快.

解决方法:

我对PHP并不熟悉,但在我看来,你可以使用类似的东西:

if (preg_match("/(?<=First).*?(?=Second)/s", $haystack, $result))
    print_r($result[0]);

(?< = First)看起来为First但不消耗它, .*?捕获第一和第二之间的所有内容, (?=秒)向前看第二但不消耗它, 最后的s是制作圆点.如果有的话匹配换行符. 要获取这些分隔符之间的所有文本,可以使用preg_match_all,并且可以使用循环来获取每个元素:

if (preg_match_all("/(?<=First)(.*?)(?=Second)/s", $haystack, $result))
    for ($i = 1; count($result) > $i; $i++) {
        print_r($result[$i]);
    }

关于如何提取unix中两个单词之间的文本?如何提取unix中两个单词之间的文本内容的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行、linux – 使用sed或awk重复提取两个字符串之间的文本?、Linux:在同一行上的特定单词之后提取一个单词、php – 解析2个单词之间的文本等相关知识的信息别忘了在本站进行查找喔。

本文标签: