shell - Shell中如何获取一个字符串在另一个字符串中的行号

标签 shell awk grep

给定

str="hij";
sourceStr="abc\nefg\nhij\nlmn\nhij";

我想获取 $sourceStr 中第一次出现 $str 的行号,应该是 3

我不知道怎么办。 我试过:

awk 'match($0, v) { print NR; exit }' v=$str <<<$sourceStr
grep -n $str <<< $sourceStr | grep -Eo '^[^:]+';
grep -n $str <<< $sourceStr | cut -f1 -d: | sort -ug
grep -n $str <<< $sourceStr | awk -F: '{ print $1 }' | sort -u

所有输出1,而不是3

如何获取$sourceStr$str的行号?

谢谢!

最佳答案

您可以在 bash 中使用此 awk + ​​printf:

awk -v s="$str" '$0 == s {print NR; exit}' <(printf "%b\n" "$sourceStr")

3

甚至这个 awk 没有任何 bash 支持:

awk -v s="$str" -v source="$sourceStr" 'BEGIN {
split(source, a); for (i=1; i in a; ++i) if (a[i] == s) {print i; exit}}'

3

您也可以使用此 sed:

sed -n "/^$str$/{=;q;}" <(printf "%b\n" "$sourceStr")

3

或者这个grep + cut:

printf "%b\n" "$sourceStr" | grep -nxF -m 1 "$str" | cut -d: -f1

3

关于shell - Shell中如何获取一个字符串在另一个字符串中的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66123719/

相关文章:

mysql - 检查mysql是否启动或关闭的shell脚本

linux - 将多个文件合并为一个文件,包括 shell 中不匹配的行

r - 转置和分组数据 - Linux/R

grep - JSONing Grepped 环境 (jq + grep + env)

linux - 在 Linux 系统上定位文件中的内容

awk - 使用 bash 在另一个字符串第一次出现后查找第一次出现的字符串

arrays - 如何通过 ssh 安全地返回 bash 数组?

linux - 无法读取输出以运行下一个命令

linux - awk inside shell脚本显示/etc/passwd信息

linux - 更改目录中数十亿个文件的后缀和前缀