我有这条线
grep -n -m7 '\$' myfile.asm | tail -n 1 | awk -F':' '{print $1}'
产生此输出:
27
我想在编辑文件的脚本中使用它。所以我在myscript.ksh
中执行了此操作:
fileName=$1
....
lastLine=`grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}'`
....
echo ${lastLine}
执行此操作时,27
中lastLine
的预期值仅为7
。这是我正在使用的文件的前30行。
$***********************************************************************
$ THE FOLLOWING BULK DATA ENTRIES RELATED TO EXT. SUPERELEMENT 5000
$ ARE FOR USE IN THE MAIN BULK DATA PORTION OF THE ASSEMBLY RUN
$***********************************************************************
$
SEBULK 5000EXTOP2 MANUAL 12
$
SECONCT 5000 0 NO
60582 60582 180021 180021 180023 180023 180057 180057
180941 180941 180942 180942 180943 180943 180944 180944
180946 180946 180947 180947 204499 204499 231050 231050
231060 231060 232050 232050 232060 232060 252300 252300
252301 252301 253072 253072 253073 253073 401101 401101
401102 401102 401103 401103 401104 401104 402101 402101
402102 402102 402103 402103 402104 402104 403101 403101
403102 403102 403103 403103 403104 403104 404101 404101
404102 404102 404103 404103 404104 404104 405101 405101
405102 405102 405103 405103 405104 405104 406101 406101
406102 406102 406103 406103 406104 406104 407101 407101
407102 407102 407103 407103 407104 407104 408101 408101
408102 408102 408103 408103 408104 408104 631050 631050
631060 631060 632050 632050 632060 632060 652300 652300
652301 652301 653072 653072 653073 653073 662050 662050
662060 662060 677500 677500 677600 677600 678516 678516
678622 678622 679514 679514 679620 679620 703077 703077
703078 703078 1184100 1184100 1184200 1184200 1184400 1184400
$
CORD2C* 220102 220104 0.000000000E+00 0.000000000E+00
* 0.000000000E+00 0.000000000E+00 0.000000000E+00 0.100000000E+01
* 0.100000000E+01 0.900000000E+02 0.100000000E+01
我要做的是在此阶段将此文件中的SECONCT条目复制到另一个文件中。我知道它以SECONCT
开头,以第7 $
结尾。就像我说它在命令行工作但在脚本中没有。如果我使用"`"在命令行运算符我收到此错误:
-ksh:7:找不到[没有这样的文件或目录]
所以这与那个运营商有关,但我之前从未遇到过这个问题。我该如何解决?
更新:
我用set -x
运行它,这是输出:
+ grep -n -m7 '$' sq93a3mkop2_4hz.asm
+ awk -F: '{print $1}'
+ tail -n 1
+ lastLine=7
错误来自\$
正在读作$
。但是我该如何解决这个问题?
答案 0 :(得分:1)
我认为你过度复杂了。
这是输出该部分的一种更简单的方法:
sed -n '/SECONCT/,/^\$$/p' myfile.asm
我没有安装ksh,但这可以在csh下运行。
说明:
答案 1 :(得分:1)
停止使用$(..)
。请改用lastLine=$(grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}')
:
$ echo '\$'
\$
$ echo "`echo '\$'`" # Working command produces different results in backticks
$
$ echo "`echo '\\$'`" # ... and requires another layer of escaping.
\$
$ echo "$(echo '\$')" # $() just works.
\$
Backticks是具有几个怪癖的遗留语法,其中一个是对某些字符强加一个新的特殊转义层:
$(..)
现代命令替换$(..)
没有这些问题,并允许您包装未修改的命令。 <button class="btn btn-default" data-toggle="modal" data-target="#theModalID"">open modal</button>
<div class="modal fade" id="theModalID" role="dialog">
<div class="tab-content">
<div id="tab1" class="tab-pane fade in active">
<!-- tab 1 -->
</div>
<div id="tab2" class="tab-pane fade">
<!-- tab 2 -->
<button type="button" class="btn btn-default" data-toggle="tab" href="#tab3">tab3</button>
</div>
<div id="tab3" class="tab-pane fade">
<!-- tab 3 -->
<button type="button" class="btn btn-default" data-toggle="tab" href="#tab1">tab1</button>
</div>
</div>
</div>
是POSIX,因此没有理由使用反引号。