我想使用 sed 从文件中提取两个特定字符串之间的所有行。我需要在脚本上执行此操作,我的两个字符串是变量。字符串将采用某种时间戳格式,这意味着它们可以是这样的: 2014/01/01
或2014/01/01 08:01
我正在尝试这样的东西:
sed -n '/$1/,/$2/p' $file
甚至
sed -n '/"$1"/,/"$2"/p' $file
没有运气,还尝试用;
替换/
作为分隔符。
我很确定问题是由于输入变量中的/
和空白造成的,但我无法弄清楚正确的语法。
使用备用正则表达式分隔符的语法为:
\ c 正则表达式 c
匹配与正则表达式正则表达式匹配的行。 c 可以是任何字符。
https://www.gnu.org/software/sed/manual/sed.html#Addresses
因此,请选择以下之一
sed -n '@'"$1"'@,@'"$2"'@p' "$file"
sed -n "\@$1@,\@$2@p" "$file"
sed -n "$( printf '@%s@,@%s@p' "$1" "$2" )" "$file"
或awk
awk -v start="$1" -v end="$1" '$0 ~ start {p=1}; p; $0 ~ end {p=0}' "$file"
从第一个 $1 到最后一个 $2:
sed -n "\@$1@,$p" "$file" | tac | sed -n "\@$2@,$p" | tac
这将从第一个 $1 打印到末尾,反转行,从第一个 $2 打印到新结尾,然后再次反转行。
一个例子:从第一个"5"到最后一个"7"
$ set -- 5 7
$ seq 20 | sed -n "\@$1@,$p" | tac | sed -n "\@$2@,$p" | tac
5
6
7
8
9
10
11
12
13
14
15
16
17
尝试使用双引号而不是单引号。
sed -n "/$1/,/$2/p" $file