Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Awk将取代单一报价_Unix_Shell_Awk - Fatal编程技术网

Unix Awk将取代单一报价

Unix Awk将取代单一报价,unix,shell,awk,Unix,Shell,Awk,我想将一组文件中的所有include('./替换为include(')。我正在尝试按如下方式使用awk: awk '{gsub("include\('"'"'./", "include\('"'"'", $0); print > FILENAME}' *.php 这让我犯了这个错误 awk: (FILENAME=xyz.php FNR=1) fatal: Unmatched ( or \(: /include('.// 任何帮助都将不胜感激。试试以下方法: awk '{gsub("in

我想将一组文件中的所有
include('./
替换为
include('
)。我正在尝试按如下方式使用awk:

awk '{gsub("include\('"'"'./", "include\('"'"'", $0); print > FILENAME}' *.php
这让我犯了这个错误

awk: (FILENAME=xyz.php FNR=1) fatal: Unmatched ( or \(: /include('.//
任何帮助都将不胜感激。

试试以下方法:

awk '{gsub("include(\'"'"'./", "include\('"'"'", $0); print > FILENAME}' *.php
你错放反斜杠了

或者这个:

 awk '{gsub("include(\'./", "include(\'", $0); print > FILENAME}' *.php
这个怎么样

awk '{gsub("include(\47./", "include(\47", $0); print > FILENAME}' *.php
你有没有试着什么都不做

awk '{gsub("include('./", "include('", $0); print > FILENAME}' *.php
这是可行的(在“打印”上没有I/O重定向):

它映射此输入:

include('./abc')
include('x/abc')
致:

根据经验,正则表达式似乎必须在斜杠内;替换字符串必须是正则字符串。您需要将“
”映射到“
\。
”以停止第二次替换

我对这个解释不太满意。MacOS X上“awk”的手册页上说:

/re/是一个常量正则表达式;任何字符串(常量或变量)都可以用作正则表达式,但模式中独立正则表达式的位置除外

因此,从理论上讲,您使用的字符串形式应该可以工作。从经验上看,它不能工作;我得到的错误消息与您在代码中得到的错误消息基本相同。而且您得到的shell引号是正确的,这是非常重要的

有时Perl可能更容易(因为您可以选择任意分隔符来标记正则表达式边界):


@OP,您可以尝试对单引号(
\047
)和正斜杠(
\057
)使用八进制代码,例如


如果您只想执行以下操作,则无需使用
awk
此外,在读取文件的过程中写入文件会导致数据丢失或损坏,请尽量不要这样做

for file in *.php ; do
# or, to do this to all php files recursively:
# find . -name '*.php' | while read file ; do
  # make backup copy; do not overwrite backup if backup already exists
  test -f $file.orig || cp -p $file $file.orig
  # awk '{... print > NEWFILE}' NEWFILE="$file" "$file.orig"
  sed -e "s:include('\./:include(':g" "$file.orig" >"$file"
done

为了澄清数据丢失方面:当
awk
(或
sed
)开始处理一个文件,并且您要求他们读取第一行时,他们实际上会执行缓冲读取,也就是说,他们将从文件系统(让我们简化一下,称为“从磁盘”)读取与内部读取缓冲区(例如4-65KB)一样大的数据块为了获得更好的性能(通过减少磁盘I/O),假设您正在处理的文件大于缓冲区大小。进一步的读取将继续从缓冲区进行,直到缓冲区耗尽,此时第二个数据块将从磁盘加载到缓冲区等

但是,就在您读取第一行之后,即从磁盘将第一块数据读取到缓冲区之后,
awk
脚本打开
FILENAME
,输入文件本身,用于通过截断写入,即磁盘上的文件大小重置为0。此时,所有剩余的original文件是
awk
内存中的前几千字节数据。
awk
将愉快地从内存缓冲区中逐行读取数据,并产生输出,直到缓冲区耗尽,此时
awk
可能会停止并留下一个4-65k文件


作为旁注,如果您实际使用awk扩展(例如,
print”前缀:$0
),而不是收缩(
gsub(/…/,“”))
),数据,那么您几乎肯定会得到一个无响应的
awk
和一个不断增长的文件。

无法处理这些错误。。。awk:警告:转义序列`\''被视为普通`''awk:警告:转义序列`('被视为普通`)('awk:(FILENAME=xyz.php FNR=1)致命:不匹配(或(:/include('./@GeekTantra我身上没有控制台或安装了awk..我会测试上面的示例..这是因为awk正在同时将其处理过程写回文件。!出于某种原因,awk是一个特定的要求吗?你真的应该使用sed。
sed-I's/include(\'.\//include(\'/g'*.php
sed,awk,两者都可以完成这项工作。你试过一个here文档吗?这样你就不必费心去转义这个命令了,但只适用于包含一个或两个类似类型语句的非常简单的文件…在一个足够大的文件中,有许多单引号和斜杠,它似乎把一切都搞糟了。我也明白了s错误:awk:警告:转义序列
\('被视为普通
(“@GeekTantra:这是您需要使用脚本文件的地方:'awk-f file*.php'。这样您就不必与shell对引号的解释以及awk对引号的解释抗争,这使整个堆变得更容易。再次警告:MacOS'awk'没有给出它,但替换字符串中括号前的反斜杠是un通缉犯-你的“awk”是正确的。在
gsub
中使用双引号有其用途。例如,如果用正斜杠代替
/
,你可以使用
gsub(“/”,”)
而不是
gsub(/\/,”)
sed,awk,两者都可以完成这项工作。可以说引用/转义的程度要低一点。:)但真正不可原谅的部分,无论是awk还是sed)使用时,实际上是在读取第一行后截断每个PHP文件,即,如果文件大于awk/sed的读取缓冲区,他只是将其文件截断为相同的字节数。awk实际上为我完成了这项工作。这不是关于使用sed或awk,而是关于哪一个更适合。正确,awk或sed将完成这项工作。我不知道请注意,您的文件中没有一个大于65k的文件。:)只是为了好玩,获取或制作一个100K的文件,然后运行原始的
gawk{…print>FILENAME}文件
命令。My
awk
在68k处停止。oops.)这是因为它会写回gawk当前正在处理的文件。这与
cat file>file
的概念相同。提供不同的文件名(如果需要,将其重命名为原始文件)是一种方法。
include('abc')
include('abc')
perl -pe "s%include\('\./%include('%g"
$ cat file
include('./
$ awk '{gsub(/include\(\047\.\057/ , "include(\047" ) }1' file
include('
for file in *.php ; do
# or, to do this to all php files recursively:
# find . -name '*.php' | while read file ; do
  # make backup copy; do not overwrite backup if backup already exists
  test -f $file.orig || cp -p $file $file.orig
  # awk '{... print > NEWFILE}' NEWFILE="$file" "$file.orig"
  sed -e "s:include('\./:include(':g" "$file.orig" >"$file"
done