【发布时间】:2019-10-30 03:39:16
【问题描述】:
一个文件:
a
b
运行命令
dd if=file count=1 skip=0 bs=1 # show a
dd if=file count=1 skip=1 bs=1 # show "newline"
dd if=file count=1 skip=2 bs=1 # show b
我想在给定偏移量之前搜索第一个“换行符”的偏移量,在 bash 脚本中使用“if”语句(这是一种虚拟方式):
para1=$1
while(1)
do
c=$(dd if=file count=1 bs=1 skip=$para1)
if [ $c -eq "\n" ] # How to write this line?
then
break
fi
para1=`expo $para - 1`
done
echo $para1
bash fun.sh 2
# the output should be 1
其实我在这里找到了解决办法:How do i compare if my variable holds a newline character in shell Script
if [ ${#str} -eq 0 ]
但我想知道它是否足够强大,还是有更优雅的方法来做到这一点?
【问题讨论】:
-
我不明白你的任务:什么是“换行偏移”,什么是“给定偏移”,“反向”是什么意思?请注意,
$仅用于说明换行符。它实际上并不存在。 -
例如:一个文件为“1234567”,“1”的偏移量为0,“3”的偏移量为2,给定偏移量2,我需要反向搜索“7”,所以没有,但是如果我需要反向搜索“1”,找到的偏移量是0。“$”确实带了一个字符。使用“dd skip=xxx count=1 bs=1”你可以找到行的最后一个字符和下一行的第一个字符之间的间隙@BenjaminW。
-
像
awk这样的东西会做吗?前任。awk -v ndx=3 'sum+length($0) < ndx {sum+=length($0); next} {print sum; exit}' file其中ndx的值是您要查找的文件中的字符,而索引之前的换行符的字符数是结果? (在这种情况下为1)。或者给定包含"hello\nworld\nthis\nis\na\ntest\n"和ndx=12的文件("this"中的'h'),结果是10('t'之前的换行符) -
$表示换行的唯一地方是正则表达式。我不明白这与这项任务有什么关系。 -
$( )总是在其读取内容的末尾修剪任何换行符,因此结果将从不匹配\n或\r\n。解决此问题的一种方法是在末尾添加保护性非换行符,然后将其删除:c=$(dd if=file count=1 bs=1 skip=$para1; echo x); c=${c%x}。此外,对于测试,-eq进行数字比较,而不是字符串比较。此外,与"\n"相比,将与后跟字母“n”的文字反斜杠进行比较,不是换行符。对于换行符,请使用$'\n'。