Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 274 Vote(s) - 3.63 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Windows batch script help for checking last line of the file

#1
I have a few hundred files,most of which contains '`exit`' at the end(the end line).Not all of the files have this '`exit`' at the end.How can I check the content of last line of the files and then remove it if it's '`exit`'?
Reply

#2
@echo off
setlocal EnableDelayedExpansion

rem "I have a few hundred files"
for %%a in (*.*) do (
rem "most of which contains 'exit' at the end line."
set "lastLine="
(for /F "usebackq delims=" %%b in ("%%a") do (
if not defined lastLine (
set "lastLine=%%b"
) else (
echo(!lastLine!
set "lastLine=%%b"
)
)) > "%%~Na.tmp"
rem "Not all of the files have this 'exit' at the end."
rem "How can I check the content of last line of the files"
if "!lastLine!" equ "exit" (
rem "and then remove it if it's 'exit'?"
move /Y "%%~Na.tmp" "%%a"
) else (
del "%%~Na.tmp"
)
)

Reply

#3
Borrowing the code from @npocmaka and using GNUsed then this should be pretty robust and preserve blank lines and work with long filenames etc. It processes the entire directory tree. It's untested.

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%Z in ('dir /s /b /a-d') do (
for /f "delims=" %%a in ('type "%%Z"') do set "last_line=%%a"
echo !last_line! | find /i "exit" >nul && (
sed $d "%%Z" > "%%Z.tmp"
move /y "%%Z.tmp" "%%Z" >nul
)
)
endlocal
Reply

#4
for [sed](

[To see links please register here]

) "only":

for %i in (*) do @sed -i"%~i.bak" "$ {s/exit/exit/i;/exit/d}" "%~i"
Reply

#5
setlocal enabledelayedexpansion
for /f "delims=" %%Z in ('dir /s /b /a-d .') do (
for /f "delims=" %%a in (%%Z) do set last_line=%%a
echo !last_line! | find "exit" && del /f /q %%Z
)
endlocal

**edit** (foxidrive reads more carefully than me):


@echo off

setlocal enabledelayedexpansion
for /f "delims=" %%Z in ('dir /s /b /a-d') do (

set /a counter=1
set "yes=no"
for /f "usebackq delims=" %%a in ("%%Z") do set last_line=%%a&& set /a counter=counter+1
echo !last_line! | find /I "exit" >nul&& set "yes=yes"
if "!yes!" equ "yes" (
break >"%%Z.tmp"
for /f "usebackq delims=" %%a in ("%%Z") do (
set /a counter=counter-1
if "!counter!" neq "1" (
endlocal
echo %%a | find "ECHO is off.">nul&&echo\>>"%%Z.tmp"
echo %%a | find "ECHO is off.">nul||echo %%a>>"%%Z.tmp"
)
)
echo "Exit" found in at the end of --%%Z--
copy /y "%%Z.tmp" "%%Z" >nul
)
)
endlocal

[edit][1]:working and a little bit improved.Still does not manage with empty lines , but now it's better.


[1]:

[To see links please register here]

Reply

#6
I have written a hybrid JScript/batch utility called REPL.BAT that makes this task extremely simple and it is very fast. The utility reads stdin, performs any regular expression search and replace, and writes the output to stout.

The utility is a script that works on any modern version of Windows, starting with XP, and does not require installation of any 3rd party tools.

The following batch script processes all files in a given path and deletes the last line of each file only if it is the word `exit` with no other characters. I use the `I` option to make the search case insensitive. The `M` option is also required to allow searches across multiple lines. The regex could easily be refined as needed. For example, you could also match and remove the last line if it contains EXIT with whitespace.

@echo off
for %%F in (\somePath\*) do (
type "%%F"|repl "^exit\r?\n?(?!\S|\s)" "" im >"%%F.new"
move /y "%%F.new" "%%F" >nul
)

The REPL.BAT file must either be in your current folder (the folder you are running from), or better yet, in one of your PATH folders.

Here is the REPL.BAT script. I have found it incredibly useful for such a small script. Complete documentation is embedded within the script.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
:::
:::REPL Search Replace [Options [SourceVar]]
:::REPL /?
:::
::: Performs a global search and replace operation on each line of input from
::: stdin and prints the result to stdout.
:::
::: Each parameter may be optionally enclosed by double quotes. The double
::: quotes are not considered part of the argument. The quotes are required
::: if the parameter contains a batch token delimiter like space, tab, comma,
::: semicolon. The quotes should also be used if the argument contains a
::: batch special character like &, |, etc. so that the special character
::: does not need to be escaped with ^.
:::
::: If called with a single argument of /? then prints help documentation
::: to stdout.
:::
::: Search - By default this is a case sensitive JScript (ECMA) regular
::: expression expressed as a string.
:::
::: JScript regex syntax documentation is available at
:::

[To see links please register here]

:::
::: Replace - By default this is the string to be used as a replacement for
::: each found search expression. Full support is provided for
::: substituion patterns available to the JScript replace method.
::: A $ literal can be escaped as $$. An empty replacement string
::: must be represented as "".
:::
::: Replace substitution pattern syntax is documented at
:::

[To see links please register here]

:::
::: Options - An optional string of characters used to alter the behavior
::: of REPL. The option characters are case insensitive, and may
::: appear in any order.
:::
::: I - Makes the search case-insensitive.
:::
::: L - The Search is treated as a string literal instead of a
::: regular expression. Also, all $ found in Replace are
::: treated as $ literals.
:::
::: B - The Search must match the beginning of a line.
::: Mostly used with literal searches.
:::
::: E - The Search must match the end of a line.
::: Mostly used with literal searches.
:::
::: V - Search and Replace represent the name of environment
::: variables that contain the respective values. An undefined
::: variable is treated as an empty string.
:::
::: M - Multi-line mode. The entire contents of stdin is read and
::: processed in one pass instead of line by line. ^ anchors
::: the beginning of a line and $ anchors the end of a line.
:::
::: X - Enables extended substitution pattern syntax with support
::: for the following escape sequences:
:::
::: \\ - Backslash
::: \b - Backspace
::: \f - Formfeed
::: \n - Newline
::: \r - Carriage Return
::: \t - Horizontal Tab
::: \v - Vertical Tab
::: \xnn - Ascii (Latin 1) character expressed as 2 hex digits
::: \unnnn - Unicode character expressed as 4 hex digits
:::
::: Escape sequences are supported even when the L option is used.
:::
::: S - The source is read from an environment variable instead of
::: from stdin. The name of the source environment variable is
::: specified in the next argument after the option string.
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
if "%~1" equ "/?" (
findstr "^:::" "%~f0" | cscript //E:JScript //nologo "%~f0" "^:::" ""
exit /b 0
) else (
call :err "Insufficient arguments"
exit /b 1
)
)
echo(%~3|findstr /i "[^SMILEBVX]" >nul && (
call :err "Invalid option(s)"
exit /b 1
)
cscript //E:JScript //nologo "%~f0" %*
exit /b 0

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var env=WScript.CreateObject("WScript.Shell").Environment("Process");
var args=WScript.Arguments;
var search=args.Item(0);
var replace=args.Item(1);
var options="g";
if (args.length>2) {
options+=args.Item(2).toLowerCase();
}
var multi=(options.indexOf("m")>=0);
var srcVar=(options.indexOf("s")>=0);
if (srcVar) {
options=options.replace(/s/g,"");
}
if (options.indexOf("v")>=0) {
options=options.replace(/v/g,"");
search=env(search);
replace=env(replace);
}
if (options.indexOf("l")>=0) {
options=options.replace(/l/g,"");
search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
replace=replace.replace(/\$/g,"$$$$");
}
if (options.indexOf("b")>=0) {
options=options.replace(/b/g,"");
search="^"+search
}
if (options.indexOf("e")>=0) {
options=options.replace(/e/g,"");
search=search+"$"
}
if (options.indexOf("x")>=0) {
options=options.replace(/x/g,"");
replace=replace.replace(/\\\\/g,"\\B");
replace=replace.replace(/\\b/g,"\b");
replace=replace.replace(/\\f/g,"\f");
replace=replace.replace(/\\n/g,"\n");
replace=replace.replace(/\\r/g,"\r");
replace=replace.replace(/\\t/g,"\t");
replace=replace.replace(/\\v/g,"\v");
replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
function($0,$1,$2){
return String.fromCharCode(parseInt("0x"+$0.substring(2)));
}
);
replace=replace.replace(/\\B/g,"\\");
}
var search=new RegExp(search,options);

if (srcVar) {
WScript.Stdout.Write(env(args.Item(3)).replace(search,replace));
} else {
while (!WScript.StdIn.AtEndOfStream) {
if (multi) {
WScript.Stdout.Write(WScript.StdIn.ReadAll().replace(search,replace));
} else {
WScript.Stdout.WriteLine(WScript.StdIn.ReadLine().replace(search,replace));
}
}
}
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through