Bash脚本删除包含任何单词列表的行

时间:2014-06-27 17:12:31

标签: bash redhat

我有一个大的配置文件,我用它来定义脚本的变量,每个脚本都在一行上定义。它看起来像这样:

var   val
foo   bar
foo1  bar1
foo2  bar2

我收集了一份我想从列表中删除的过时变量列表。我可以手动完成它,但我想用脚本来做,这至少会更刺激。包含vlaues的文件可能包含多个实例。我们的想法是找到价值,如果找到了,就删除整行。

有人知道这是否可行?我知道sed这样做但我不知道如何使用文件输入。

2 个答案:

答案 0 :(得分:1)

#!/bin/bash
shopt -s extglob
REMOVE=(foo1 foo2)
IFS='|' eval 'PATTERN="@(${REMOVE[*]})"'
while read -r LINE; do
    read A B <<< "$LINE"
    [[ $A != $PATTERN ]] && echo "$LINE"
done < input_file.txt > output_file.txt

或(先使用副本)

#!/bin/bash
shopt -s extglob
FILE=$1 REMOVE=("${@:2}")
IFS='|' eval 'PATTERN="@(${REMOVE[*]})"'
SAVE=()
while read -r LINE; do
    read A B <<< "$LINE"
    [[ $A != $PATTERN ]] && SAVE+=("$LINE")
done < "$FILE"
printf '%s\n' "${SAVE[@]}" > "$FILE"

使用

运行
bash script.sh your_config_file pattern1 pattern2 ...

或者

#!/bin/bash
shopt -s extglob
FILE=$1 PATTERNS_FILE=$2
readarray -t REMOVE < "$PATTERNS_FILE"
IFS='|' eval 'PATTERN="@(${REMOVE[*]})"'
SAVE=()
while read -r LINE; do
    read A B <<< "$LINE"
    [[ $A != $PATTERN ]] && SAVE+=("$LINE")
done < "$FILE"
printf '%s\n' "${SAVE[@]}" > "$FILE"

使用

运行
bash script.sh your_config_file patterns_file

答案 1 :(得分:0)

这是sed的一个。向数组添加单词。然后使用

./script target_filename 

(假设您将以下内容放在名为script的文件中)。 (效率不高)。我认为如果我们将这些单词连接起来并将它放在像bbonev那样的正则表达式中它可能会更有效

#!/bin/bash

declare -a array=("foo1" "foo2")

for i in "${array[@]}";
do
  sed -i "/^${i}\s.*/d" $1
done

使用文件输入实际上更简单

如果你有一个word文件

word1
word2
word3
.....

然后以下将完成工作

#!/bin/bash

while read i; 
do
  sed -i "/^${i}\s.*/d" $2
done <$1

用法:

./script wordlist target_file