使用bash shell脚本提取两个字符串之间的字符串

11 浏览
0 Comments

使用bash shell脚本提取两个字符串之间的字符串

我看到类似的问题,但是在这种情况下,没有一个解决方案似乎适用。我有一个类似于这样的文本文件\n

START-OF-FILE
RUNDATE=20140910
FIRMNAME=dl
FILETYPE=pc
REPLYFILENAME=TEST
DERIVED=yes
PROGRAMFLAG=oneshot
SECID=ISIN
SECMASTER=yes
PROGRAMNAME=getdata
START-OF-FIELDS
ISSUER
START-OF-DATA
US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |
END-OF-DATA
END-OF-FILE

\n我试图编写一个bash脚本来提取只在\"START-OF-DATA\"和\"END-OF-DATA\"之间的文本,但不包括它们本身。所以我期望的输出看起来像这样\n

US345370CN85|0|4|FORD MOTOR COMPANY|FORD MOTOR COMPANY| | |
US31679BAC46|0|4|FIFTH STREET FINANCE COR|FIFTH STREET FINANCE COR| | |

\n我目前编写的代码如下所示\n

while read line
do
    name=$line
    echo $name | sed -e 's/START-OF-DATA\(.*\)END-OF-DATA/\1/'
done < $1

\n并在bash中运行它,如下所示\n

./script.sh file.txt

\n其中script.sh是我保存的脚本文件,file.txt是上面读取的文本文件。目前它只是读取并回显整个文件。我猜测这是语法上的一些小问题。希望能得到指引,非常感谢。

0
0 Comments

问题的出现原因是希望用bash shell脚本提取两个字符串之间的内容,但是现有的解决方法中仍然包含了起始字符串和结束字符串。需要找到一种方法来避免打印这两个字符串。

解决方法是使用perl正则表达式的look-around assertions来匹配字符串,但不包括在结果中。具体的方法是在匹配起始字符串和结束字符串之间的内容时,使用"(?<=START-OF-DATA\n)"和"(?=\nEND-OF-DATA)"来进行断言。

以下是改进后的命令行示例:

grep -Pzo "(?s)(?<=START-OF-DATA\n).*(?=\nEND-OF-DATA)"

这样就可以避免打印起始字符串和结束字符串,只输出两个字符串之间的内容。

0
0 Comments

原因:问题是关于如何在bash shell脚本中提取两个字符串之间的内容。提问者提到了两种解决方法,一种是使用标记来判断是否在目标文本块内,另一种是使用sed命令。然后有其他回答者指出了sed命令的一种写法,并得到了提问者的确认。

解决方法:提问者首先提出了一种解决方法,即在遇到"START-OF-DATA"时设置一个标记为"True",并在遇到"END-OF-DATA"时结束。然后通过判断标记是否为"True"来决定是否打印输出。另一种解决方法是使用sed命令,具体写法是sed -n '/START-OF-DATA/,/END-OF-DATA/ { //!p }' file.txt,这个命令会打印出位于"START-OF-DATA"和"END-OF-DATA"之间的内容。

文章如下:

在bash shell脚本中提取两个字符串之间的内容是一个常见的需求。下面我们介绍两种解决方法供大家参考。

首先是一种使用标记的方法。我们可以在遇到"START-OF-DATA"时设置一个标记为"True",并在遇到"END-OF-DATA"时结束。通过判断标记是否为"True",我们可以决定是否打印输出。具体代码如下:

marker="False"
while IFS= read -r line; do
  if [[ $line == "START-OF-DATA" ]]; then
    marker="True"
  elif [[ $line == "END-OF-DATA" ]]; then
    marker="False"
  fi
  if [[ $marker == "True" ]]; then
    echo "$line"
  fi
done < file.txt

另一种解决方法是使用sed命令。sed是一个流编辑器,可以对文本进行各种操作。下面是一个使用sed命令提取字符串的例子:

sed -n '/START-OF-DATA/,/END-OF-DATA/ { //!p }' file.txt

这个命令会打印出位于"START-OF-DATA"和"END-OF-DATA"之间的内容。

以上就是我们介绍的两种在bash shell脚本中提取两个字符串之间内容的方法。希望对大家有所帮助。

0
0 Comments

问题的出现原因是需要从给定的文件中提取两个特定字符串之间的内容。解决方法是使用awk或sed的shell脚本。

awk是一种文本处理工具,可以用于从文件中提取指定模式之间的内容。在这个问题中,我们可以使用awk的模式匹配功能,通过设置一个标志变量p来判断是否处于要提取的内容范围内。当匹配到"START-OF-DATA"时,将标志变量p设为1,当匹配到"END-OF-DATA"时,将标志变量p设为0并退出。最后,如果标志变量p为1,则打印当前行。

另一种解决方法是使用sed。sed是一个流式文本编辑器,可以用于对文本进行各种操作。在这个问题中,我们可以使用sed的"-n"选项来禁止自动打印输入行。然后使用"/START-OF-DATA/,/END-OF-DATA/"模式来匹配起始和结束字符串之间的内容。最后使用"!p"命令来打印不匹配该模式的行。

这两种方法都能够实现从文件中提取两个特定字符串之间的内容。根据具体需求和个人喜好,可以选择使用awk或sed来解决这个问题。无论选择哪种方法,都可以快速准确地提取所需的内容。

0