我有一个大的配置文件,我用它来定义脚本的变量,每个脚本都在一行上定义。它看起来像这样:
var val
foo bar
foo1 bar1
foo2 bar2
我收集了一份我想从列表中删除的过时变量列表。我可以手动完成它,但我想用脚本来做,这至少会更刺激。包含vlaues的文件可能包含多个实例。我们的想法是找到价值,如果找到了,就删除整行。
有人知道这是否可行?我知道sed
这样做但我不知道如何使用文件输入。
答案 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