Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个bash脚本,删除不是以x、y或z开头的每一行文本_Bash - Fatal编程技术网

编写一个bash脚本,删除不是以x、y或z开头的每一行文本

编写一个bash脚本,删除不是以x、y或z开头的每一行文本,bash,Bash,我正在尝试编写一个bash脚本,它将遍历一个文本文件TextInput.txt,并删除每一行不以s1、s2开头的文本。。。sN(其中sX是一个单字符或多字符字符串;在下面的示例中,我将使用“Rabbit”、“Squirrel”和“Puppy”作为公认的行首)。然后,它应该将所有内容写入一个新的文本文件TextOutput.txt 由于不支持bash脚本,我只编写了这个相当有限的虚拟代码 #!/bin/sh TextInput=$(<TextInput.txt) AcceptedString

我正在尝试编写一个bash脚本,它将遍历一个文本文件TextInput.txt,并删除每一行不以s1、s2开头的文本。。。sN(其中sX是一个单字符或多字符字符串;在下面的示例中,我将使用“Rabbit”、“Squirrel”和“Puppy”作为公认的行首)。然后,它应该将所有内容写入一个新的文本文件TextOutput.txt

由于不支持bash脚本,我只编写了这个相当有限的虚拟代码

#!/bin/sh
TextInput=$(<TextInput.txt)
AcceptedStrings[0]='Rabbit'
AcceptedStrings[1]='Squirrel'
AcceptedStrings[2]='Puppy'

# What goes here?

echo "$TextModified" > TextOutput.txt
#/垃圾箱/垃圾箱
TextInput=$(TextOutput.txt

如果在命令行上指定了字符串,则可以使用
grep-v
对其进行循环。如果已经知道所有字符串,则可以执行
egrep-v^(str1 | str2 | str3)filename


再次阅读您的问题时,您说您希望删除不以指定字符串开头的行,但在示例中,您给出了一个接受字符串的列表。您可能需要对此进行澄清。

如果在命令行上指定了字符串,您可以使用
grep-v
对其进行循环。如果您已经知道所有字符串gs,您可以执行egrep-v^(str1 | str2 | str3)文件名


再次阅读您的问题时,您说要删除不以指定字符串开头的行,但在示例中,您给出了一个接受字符串的列表。您可能需要对此进行澄清。

如上所述,您可以使用
grep
。但是,如果您想使用
bash
执行此操作,您可以说:

acceptedstring=( Rabbit Squirrel Puppy )
pattern=$( IFS=$'|'; echo "${acceptedstring[*]}" )
while read -r line; do
 [[ "$line" =~ ^($pattern) ]] || echo "$line"
done < TextInput.txt > TextOutput.txt
acceptedstring=(兔子松鼠小狗)
模式=$(IFS=$'|';回显“${acceptedstring[*]}”)
当读取-r行时;执行
[[“$line”=~^($pattern)]| | echo“$line”
完成TextOutput.txt
如上所述,您可以使用
grep
。但是,如果您想使用
bash
,您可以说:

acceptedstring=( Rabbit Squirrel Puppy )
pattern=$( IFS=$'|'; echo "${acceptedstring[*]}" )
while read -r line; do
 [[ "$line" =~ ^($pattern) ]] || echo "$line"
done < TextInput.txt > TextOutput.txt
acceptedstring=(兔子松鼠小狗)
模式=$(IFS=$'|';回显“${acceptedstring[*]}”)
当读取-r行时;执行
[[“$line”=~^($pattern)]| | echo“$line”
完成TextOutput.txt

首先将接受字符串数组转换为模式,然后使用
grep
查找与模式匹配的所有行:

pattern=$(printf "|%s" "${AcceptedStrings[@]}")
pattern=${pattern:1}

grep "^($pattern)" TextInput.txt > TextOutput.txt

首先将接受字符串数组转换为模式,然后使用
grep
查找与模式匹配的所有行:

pattern=$(printf "|%s" "${AcceptedStrings[@]}")
pattern=${pattern:1}

grep "^($pattern)" TextInput.txt > TextOutput.txt

您可以尝试
egrep
egrep“^(s1 | s2 |…| sN)”TextInput.txt>TextModified.txt
您可以尝试
egrep
egrep“^(s1 | s2 |…| sN)”TextInput.txt>TextModified.txt
“您说过要删除不以指定字符串开头的行,但在示例中,您给出了一个接受字符串的列表”-本质上,这不是同一件事吗?我把它理解为将被接受为行首的字符串列表。现在我明白你的意思了。“你说过要删除不以指定字符串开头的行,但在示例中,你给出了一个接受字符串的列表”-本质上,这不是同一件事吗?好吧,我把它看作是一个字符串列表,它将被接受为行的开头。现在我明白你的意思了。